指针的初始化总结


1.    字符指针的初始化

在c语言中 "string"保存的就是首个字符所在的地址  所以可以把 字符串常量"string" 赋值给指针 char *p;  p="string"  但不能把字符串常量直接赋给数组,需要用到 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了。

2.    整形指针的初始化

试看下面语句哪一行 能够 打印输出?
int a = 10;
int * p1 = 0;     
int * p2 = &a;  //常见,初始化为某变量的地址
int * p3 = 20;    
printf("p1=%p, *p1=%d\n", p1, *p1);
printf("p2=%p, *p2=%d\n", p2, *p2);
printf("p3=%p, *p3=%d\n", 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的值。

3.    指针数组的初始化

问题一:
const char *p[] ={"aaa", "bbb"};        // 这样在定义p的时候完成了初始化,那么
int *p1[] ={1,2};       //
Wrong! 为什么不可以? 如何在定义p1的时候进行初始化?
int *p2[] = {NULL, NULL};        //
OK. 这样又可以了?
问题二:
我想定义一个指针数组(虽然很少人用这个东西),那么,对这个指针的初始化怎么做?
int * pstr[5];
------------------------
 const char *p[] = {"aaa", "bbb"};  指向字符的指针数组,数组中的元素是字符串,指针数组保存的是字符串首地址,没有问题。
对于int *p1[] ={1, 2}而言,存在二义性,它既可以表示int p1[2][0],即p1[0][0]=1,p1[1][0]=2
也可表示为int p1[n][2],即:p1[0][0]=1,p1[0][1]=2; 
我们可以这样:
    int *p[3];
    for(i=0; i<3; ++i)
    {
        p[i] = (int *)malloc( sizeof(int));
    }
    /* Do something with p[i] */

    for(i=0; i<3; ++i)
    {
        free(p[i]); 
    }
不然怎么样呢? 这样比较好:
int arr[3][2] = { {1, 2},  {3, 4},  {5, 6} };
int *pa[3];
for(int i=0;  i < 3; ++i) {
    pa[i] = arr[i];
}
而 int *p[3] = { {1, 2},  {3, 4},  {5, 6} };  是不行的!Warning一堆。


4.    struct 指针的初始化

struct_type *p;
p = (struct_type *)malloc( sizeof(struct_type) );

总之,
尽量用其他变量来初始化指针。


转自:http://blog.chinaunix.net/uid-26448049-id-3042505.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章