• 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的值。

  • 相关阅读:
    多线程学习
    Redis学习2
    Redis学习1
    封装
    创建对象内存分析
    稀疏数组
    反转数组、冒泡排序
    可变参数
    .net core 3.x Web Api + Docker个人练手项目
    .net 性能优化手段
  • 原文地址:https://www.cnblogs.com/VIPler/p/4319313.html
Copyright © 2020-2023  润新知