C语言的char指针初始化理解

对于一个char *p指针变量,可以使用:
char b[10];
strcpy(b, "abc");
p = b;
为p初始化。这里是让p指针指向b的空间。

但不能使用:strcpy(p, b);这样,因为这相当于改变p指针指向的内容,但现在p指针还未初始化,是一个野指针。

以上理解是否正确呢?谢谢!

char 指针,也就是char *类型。 其初始化本质上与其它变量初始化没有什么区别,就是赋予其一个初始化的值。
对于指针来说,在C语言中,就是一个地址。区分初始化情况,有四种表象:
1 初始化为空。即
char * str = NULL;
的形式,NULL在C语言中是特定的空指针,其值为0.在C语言中,以NULL作为指针的一个未生效状态,其本身是一个非法的地址值。

2 初始化为常量字符串地址。
char * str = "test";
常量字符串在运行时会被放在常量空间中,于是这样初始化后,地址是常量空间中的一个地址,对于该地址只能读取,不可写入。即str的值可以改,但是str指向的值是不可修改的。

3 初始化为变量地址。
这里的变量地址,包括全局变量,局部变量的地址,以及通过动态分配申请到的内存地址。
这种情况下,对指针指向的空间是可以修改的。

4 不做初始化。
这种情况在C语言中是允许的。如果为全局变量或静态局部变量,系统默认初始化为0值,即NULL。而对于局部变量,将是一个随机值。所以如果是局部变量不做初始化,在取其指向空间值前,必须为其指定一个合法的值,否则访问会出错。
温馨提示:内容为网友见解,仅供参考
第1个回答  2011-05-18
你好!!!
char s[]="BOOK"
char s[10]="BOOK"
都表示在声明数组的时候,就初始化,就是先了定义,即给数组分配了内存空间,系统并把字符“BOOK”,放到刚才的空间里,所以是符合语法的。

但是
char s[10];
s[10]="BOOK"
和 char s[10];
s[]="BOOK"
都是错误的,原因是:语法规定字符数组要是在声明的时候没有初始化,就没有机会直接赋值了(具体的原因后面再说)
要想赋值,必须用strcpy()
但是我们定义字符指针就不一样了,比如:
char *p;
p="hello";表示此时定义了一个指针变量,此时系统会把字符串="hello";放到内存的静态存储区(即内存的一种,是静态的原因是里的值是不能修改的)并把字符串的首地址赋值给指针变量p,使指针变量指向字符串;这是可以的。

现在我们看看:
char s[10];
s[10]="BOOK"
和 char s[10];
s[]="BOOK"
到底是什么原因:
char s[10];首先声明了字符数组,但是没有分配空间,接着
s[10]="BOOK"因为现在的是数组s已经声明过了,系统会先字符串放到静态存储区,然后返回一个指针,但是此时等号左边是数组而且有10个字节这么大,等号两边都是不同类型的,怎么可以赋值呢???
编译器检查错误就会报错了。

呵呵,希望lz可以理解。
本回答被提问者采纳
第2个回答  2011-05-18
因为这相当于改变p指针指向的内容,但现在p指针还未初始化,未指向一段合法空间的地址。是一个野指针。
第3个回答  2011-05-18
我也是个新手,我来说下我的理解吧
指针里面是没有值的,他只有个地址,char类型就是一个char的大小,你可以把他当路牌,当你要去故宫,看到了故宫的路牌,循着路牌指示的方向,就能找到故宫。所以p里放的是地址不能是值
strcpy是拷贝的值不能用来初始化指针的
给指针的都应该是值,C++里用p=&b这样表示吧b的地址给p
第4个回答  2011-05-18
因为p只是一个指针,strcpy(p, b);要把b的内容复制进去,而p指向的位置没有足够的空间(因为是野指针,没有为它申请内存空间),所以strcpy(p, b);是不可以的.
p=b是让p指向了b,此时p指向的空间是b的空间,所以当你改变p的内容时,b的内容也跟着改变了.
如果你让p申请了足够大的空间,strcpy(p, b);也是没问题的.
可能有点乱,好好理一下吧.
初始化正确的理解应该是在开始的时候就进行了操作,比如char* p=b;这样的应该叫初始化.
如果按照你的想法,那p=b;后,p=c的话,这句是不是应该叫初始化呢
相似回答