zoukankan      html  css  js  c++  java
  • C++指针初始化总结

    1.字符指针的初始化

    在c语言中 "string"保存的就是首个字符所在的地址  所以可以把 字符串常量"string" 赋值给指针 char *p; 

    char *s ="123456";

    p="string"  但不能把字符串常量直接赋给数组,

    char ch1[10];
    ch1="123456";

    需要用到 strcpy。

    strcpy_s(ch1,"123456");//VS2012用strcpy_s才过,是strcpy的安全版本

    但可以对数组初始化为字符串,也就是字符数组。如  char str[] = "string"; 

    两种初始化的区别:

    char * p="the fine day" ;
    char str[]="the fine day"

    不同, 这两个都是给字符串的初始化,前者只是把字符串的首地址给str,没有分配足够的内存地址来保存整个字符串 , 后者初始化的同时,把他们保存在数组中,也就是分配好了所有字符需要的内存。 所以:

    (1)  char *p = "string";    // 地址变量p 保存的是 's' 的地址,,
    (2)  char str[] = "the fine day";    //字符数组str保存的是整个字符串,某些情况下退化为指针
    (3)  char *str1 = "the day";  // OK.

    此时,如果要复制另一个字符串str1 到p或str:

    strcpy(p, str1);    //错误!   需改为  p=(char*)malloc( strlen(str1)+1 );  才正确
    strcpy(str, str1);    //没错误,已有足够内存,但不能总是保证。
    strncpy(str, str1, strlen(str) );    //正确!不作讨论

    实际上,(1)中是不对的,好像新标准已经会报错;
    通常应该这样初始化:strcpy(p, "string");
    或者改为:const *p = ""string";  但这样就不能修改p了。

    针对这个分配的内存空间可能不足导致溢出的不安全问题,已经出了一个新的版本strcpy_s。具体参考其他日志。

    另外补充一点,这样初始化时错误的

    char *p ='a';//指针只能保存地址,不是保存值(字符a)

    2.整形指针的初始化

    试看下面语句哪一行 能够 打印输出?

    int a = 10;
    int * p1 = 0;     
    int * p2 = &a;  //常见,初始化为某变量的地址
    int * p3 = 20;    
    printf("p1=%p, *p1=%d
    ", p1, *p1);
    printf("p2=%p, *p2=%d
    ", p2, *p2);
    printf("p3=%p, *p3=%d
    ", p3, *p3);

    这几行语句编译时会有警告:p3那一行将整数赋值给指针,没做类型转换。
    运行时会导致崩溃。
    为什么呢?

    仔细看一下,int * p1 = 0;     //真的初始化了吗?
                         int * p3 = 20;    // *p3 初始化成20了吗?
    其实int *p1 = 0 相当于 int *p1 = NULL,不能读取空指针 p1 以及 *p1 的值!,编译不会报错,但是运行时会报异常。
    而 int *p3 = 20 相当于 int *p3;   p3 = (int *)0x00000014; 不能读取*p3的值。

  • 相关阅读:
    JavaSE 基础 第51节 定义自己的异常
    JavaSE 基础 第50节 Java中的异常链
    JavaSE 基础 第49节 手动抛出异常
    JavaSE 基础 第48节 Java中的异常声明
    JavaSE 基础 第47节 获取异常信息
    JavaSE 基础 第46节 异常的分类
    JavaSE 基础 第45节Java异常快速入门
    JavaSE 基础 第44节 引用外部类的对象
    JavaSE 基础 第43节 静态内部类
    通用爬虫
  • 原文地址:https://www.cnblogs.com/VIPler/p/4319313.html
Copyright © 2011-2022 走看看