求教高手:char* a = "zhf" 和 char a[] = "zhf" 之间的区别解决思路
求教高手:char* a = "zhf"; 和 char a[] = "zhf"; 之间的区别
如题:
我是这样理解的,大家看对不对
1、char* a = "zhf "; 声明了一个字符类型的指针a,并为它赋值初始值为 "zhf "其中字符串 "zhf "应属于全局静态存储区,这里对a[1] = 'k ',在MFC编程中会出错,高手解释一下为什么?这里 a = null,可以,容易理解,因为a是指针类型。
2、char a[] = "zhf "; 声明了一个字符型数组,并赋初值。这里的字符串 "zhf "应该是属于堆存储区,是在局部开辟的空间。所以,这里对a[1] = 'k ';是正确的。由于数组类型a相当于一个const型的指针,所以a = null;会出错。
欢迎高手纠正、补充。
------解决方案--------------------
那里不能修改就是因为它存在常量区中。
------解决方案--------------------
char* a = "zhf ";
定义一个 指针 a,
指向一个 常量字符串 "zhf " 的首地址,
由于 "zhf " 是一个常量字符串, 在常量区,无法修改,所以 a[1] = 'k ' 出错,它意图修改常量;
但是 a 这个指针本身是可以修改的。
char a[] = "zhf ";
定义一个 char 数组,
该数组的内容是 "zhf ", 这里有一个赋值,
"zhf " 被赋值给了这个数组, 数组中的值是可以修改的,
也就是 a[1] = 'k ' 是允许的;
但是 数组名 是const 属性的, 不能修改。
------解决方案--------------------
标准写法:const char* a = "zhf ";。编译器也可接受:char* a = "zhf ";,是因为编译器不很规范。
------解决方案--------------------
char* a = "zhf "; 和 char a[] = "zhf "; 之间的区别
------------------------------------------------
char* a = "zhf ";
这个不可以修改,即“a[2]= 'a ';”是错误的,因为a指向常量存储区;
char a[] = "zhf ";
这个可以修改,即“a[2]= 'a ';”是正确的,因为上述初始化已经将字符全部赋值到数组中了。
------解决方案--------------------
char *a= "zhf "定义一个字符型指针a,赋指为常量字符串“zhf”的首地址。指针本身可以修改,如char *p=NULL;a=p;,但不能a[1]=“k”。
char a[]=“zhf”定义一个字符型数组,“zhf”被复制到这个数组中,数组的值可以被改变,但数组名为const型指针,不能被修改
------解决方案--------------------
http://dev.****.net/author/dedodong/0403c92b71df44f7addf610fa1692e76.html
这个是正解
------解决方案--------------------
http://dev.****.net/author/justrun2005/4df3579cbb044b9fa989231379db9661.html
还有这个
------解决方案--------------------
char *a = "zhf "是在常量区,而并不是在“全局”静态存储区,但这也并不是一定的,跟编译器有关,在常量区的内存可以视为const并且不能修改
char a[] = "zhf "是在栈中,而并不是“堆”存储区,一般直接声明并定义的变量都在栈中,堆中的空间要通过内存申请才能得到
------解决方案--------------------
"这里 a = null,可以,容易理解,因为a是指针类型。 "
这个你用什么编译器说可以?VC6.0不可以啊
------解决方案--------------------
补充点吧
char *a[]= "aaaaaaa ";
char *b= "bbbbbbb ";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
对应的汇编代码
10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
------解决方案--------------------
2、char a[] = "zhf "; 声明了一个字符型数组,并赋初值。这里的字符串 "zhf "应该是属于堆存储区(栈存储区域,如果是堆的话,不就内存泄露了)
------解决方案--------------------
char a[]= "aaaaaaa ";
char *b= "bbbbbbb ";
在ROM/RAM中都有这两个常量串6161616161616100和626262626262626200
如题:
我是这样理解的,大家看对不对
1、char* a = "zhf "; 声明了一个字符类型的指针a,并为它赋值初始值为 "zhf "其中字符串 "zhf "应属于全局静态存储区,这里对a[1] = 'k ',在MFC编程中会出错,高手解释一下为什么?这里 a = null,可以,容易理解,因为a是指针类型。
2、char a[] = "zhf "; 声明了一个字符型数组,并赋初值。这里的字符串 "zhf "应该是属于堆存储区,是在局部开辟的空间。所以,这里对a[1] = 'k ';是正确的。由于数组类型a相当于一个const型的指针,所以a = null;会出错。
欢迎高手纠正、补充。
------解决方案--------------------
那里不能修改就是因为它存在常量区中。
------解决方案--------------------
char* a = "zhf ";
定义一个 指针 a,
指向一个 常量字符串 "zhf " 的首地址,
由于 "zhf " 是一个常量字符串, 在常量区,无法修改,所以 a[1] = 'k ' 出错,它意图修改常量;
但是 a 这个指针本身是可以修改的。
char a[] = "zhf ";
定义一个 char 数组,
该数组的内容是 "zhf ", 这里有一个赋值,
"zhf " 被赋值给了这个数组, 数组中的值是可以修改的,
也就是 a[1] = 'k ' 是允许的;
但是 数组名 是const 属性的, 不能修改。
------解决方案--------------------
标准写法:const char* a = "zhf ";。编译器也可接受:char* a = "zhf ";,是因为编译器不很规范。
------解决方案--------------------
char* a = "zhf "; 和 char a[] = "zhf "; 之间的区别
------------------------------------------------
char* a = "zhf ";
这个不可以修改,即“a[2]= 'a ';”是错误的,因为a指向常量存储区;
char a[] = "zhf ";
这个可以修改,即“a[2]= 'a ';”是正确的,因为上述初始化已经将字符全部赋值到数组中了。
------解决方案--------------------
char *a= "zhf "定义一个字符型指针a,赋指为常量字符串“zhf”的首地址。指针本身可以修改,如char *p=NULL;a=p;,但不能a[1]=“k”。
char a[]=“zhf”定义一个字符型数组,“zhf”被复制到这个数组中,数组的值可以被改变,但数组名为const型指针,不能被修改
------解决方案--------------------
http://dev.****.net/author/dedodong/0403c92b71df44f7addf610fa1692e76.html
这个是正解
------解决方案--------------------
http://dev.****.net/author/justrun2005/4df3579cbb044b9fa989231379db9661.html
还有这个
------解决方案--------------------
char *a = "zhf "是在常量区,而并不是在“全局”静态存储区,但这也并不是一定的,跟编译器有关,在常量区的内存可以视为const并且不能修改
char a[] = "zhf "是在栈中,而并不是“堆”存储区,一般直接声明并定义的变量都在栈中,堆中的空间要通过内存申请才能得到
------解决方案--------------------
"这里 a = null,可以,容易理解,因为a是指针类型。 "
这个你用什么编译器说可以?VC6.0不可以啊
------解决方案--------------------
补充点吧
char *a[]= "aaaaaaa ";
char *b= "bbbbbbb ";
aaaaaaaaaaa是在运行时刻赋值的;
而bbbbbbbbbbb是在编译时就确定的;
但是,在以后的存取中,在栈上的数组比指针所指向的字符串(例如堆)快。
对应的汇编代码
10:a=c[1];
004010678A4DF1movcl,byteptr[ebp-0Fh]
0040106A884DFCmovbyteptr[ebp-4],cl
11:a=p[1];
0040106D8B55ECmovedx,dwordptr[ebp-14h]
004010708A4201moval,byteptr[edx+1]
004010738845FCmovbyteptr[ebp-4],al
------解决方案--------------------
2、char a[] = "zhf "; 声明了一个字符型数组,并赋初值。这里的字符串 "zhf "应该是属于堆存储区(栈存储区域,如果是堆的话,不就内存泄露了)
------解决方案--------------------
char a[]= "aaaaaaa ";
char *b= "bbbbbbb ";
在ROM/RAM中都有这两个常量串6161616161616100和626262626262626200