首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求教高手:char* a = "zhf" 和 char a[] = "zhf" 之间的区别解决思路

2012-04-03 
求教高手:char* a zhf 和 char a[] zhf 之间的区别如题:我是这样理解的,大家看对不对1、char*a

求教高手: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.csdn.net/author/dedodong/0403c92b71df44f7addf610fa1692e76.html
这个是正解
[解决办法]
http://dev.csdn.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


如果这两个串是一样的,它门可能合并。假设他们所在的地址分别是AA,BB
以上代码:
char a[]= "aaaaaaa "; ==> char a[7]; memcpy(a,AA,7);
char *b= "bbbbbbb "; ==> char *b=BB;


[解决办法]
这问题很简单啊,
前一个a是变量,a++合法;后一个a是常量,a+=非法。

char* a= "zhf ";会把zhf字符串分配到只读空间,然后再给a分配一个可写空间。
char a[]= "zhf ";只把zhf字符串分配到只读空间,a是常量不分配空间。
[解决办法]
想不到zhf是我名字的缩写呵呵
我的理解和楼主相同
[解决办法]
纠正“yht201(flyingbird) ”的说法——两个 "asd "肯定都是在常量区,编译器在编译的时候只会创建一个存放 "asd "的内存。

任何字面值类型都是const的,有地址的,哪怕字符串的字面值一模一样,但只要出现在程序中的位置不同,地址就不同。若不信可以运行下面代码cout < <( "hello "== "hello ": " equal "| " not equal ");结果是 not equal,不相等,因为两个字符串的地址不相等。这也就是为什么字符串的比较要用strcmp()函数。

我只完全同意“jixingzhong(瞌睡虫·星辰)”的回答:

char* a = "zhf ";
定义一个 指针 a,
指向一个 常量字符串 "zhf " 的首地址,
由于 "zhf " 是一个常量字符串, 在常量区,无法修改,所以 a[1] = 'k ' 出错,它意图修改常量;
但是 a 这个指针本身是可以修改的。

char a[] = "zhf ";
定义一个 char 数组,
该数组的内容是 "zhf ", 这里有一个赋值,
"zhf " 被赋值给了这个数组, 数组中的值是可以修改的,
也就是 a[1] = 'k ' 是允许的;
但是 数组名 是const 属性的, 不能修改。


[解决办法]
正如高手们说得那样,我补充一下.
char *s1 = "Hello "; 声明了一个常量字符串 "Hello\0 ". 并且声明了一个指向字符串的指针s1,并把常量字符串在内存中的地址赋值给了s1.因为s1指向常量,因此s1指向的一段空间是不可更改内容的.于是诸如(s1),(s1+1),(s1+2)等地址均为只读.更改它们的内容将引起错误.有的编译器会出编译错误,有的只会有运行时错误.注意,s1本身可改变.即指针本身的地址值可改变,但指针指向的内容不可改变.

char s2[] = "World "等价于char s2[] = { 'W ', 'o ', 'r ', 'l ', 'd ', ' '\0 '};很明显,这是个数组赋值操作.s2中的内容均可改变.因此*(s2+1)= 'O '之类的赋值操作是合法的.另外C不允许如下的数组赋值:
char s2[6];
s2 = "World "; //非法
C中规定数组初始化必须和数组声明语句一同书写.因此只能写成:
char s2[]= "World "或char s2[6] = "World ".

对于 char *s1 = "Hello "来说,编译器会将 "Hello "看成常量.但是可以用copy的方法将 "Hello "copy到另一段内存中,但这种copy不会传递read-only属性.我们可以做如下试验:
char *s1 = "Hello ";
char *s2 = malloc(strlen(s1));
memcpy(s2, s1, strlen(s1));
*(s2+1) = 'E ';
printf( "%s\n ", s2);
给出的屏幕显示结果是HEllo.这里我们将常量 "Hello "所在的一段内存copy到另一段内存中,s2指向那段内存.在copy过程中 "Hello "的只读性质没有被保留.新的copy字符串虽然和 "Hello "一样但是内容是变量.所以可以修改内中值.

最后一个值得注意的地方.在C中凡是用 " "表示的任何字串在内存中存储时均会在末尾加一个 '\0 '字符串终结符号,其值等于(char)0.所以任何 " "表示的字符串在内存中均占用多一个byte.

谢谢.
[解决办法]
char a[] = "zhf "; 感觉这里的字符串 "zhf "应该放在栈中,比如说在某个局部(循环体内或函数内)定义一个数组,那么超出这个局部后该字符串的空间就自动释放了,无需手动free。所以应该放在栈中。
而char* a = "zhf "; 中的字符串 "zhf "应该在全局常量区。
[解决办法]
To yanfeng(烟峰):
你的感觉是错误的.之所以有这样的感觉,这里的char a[] = "zhf ",实际上涉及到2个存储空间,一个是存放 "zhf "的,4个字节z, g, f, \0. 另外一个是存放 "zhf "所在空间的地址的, 也就是a, 也是4个字节, 但是是一个整数.

"zhf "是在常量区的,函数退出不会释放,只是永远其它函数无法访问而已.a会被释放,因为a存放在栈里面.

To calebgch():
你的说法也是错的, 占用内存一样多.看上面的解释.
[解决办法]
我来说说:比如 32 位环境, "zhf " 数据不能说明问题,用 "abcd " 吧,反正不能是 3 个字符.


#include "stdio.h "
#include "string.h "

int main(void)
{


char* a = "abcd ";
char b[]= "abcd ";
printf( "%d\n%d\n%d\n%d\n ",sizeof(a), sizeof(b),strlen(a),strlen(b));
return 0;
}

结果是:
4
5
4
4
明白了么?
sizeof 是编译期处理的.
[解决办法]
我只完全同意“jixingzhong(瞌睡虫·星辰)”的回答:

char* a = "zhf ";
定义一个 指针 a,
指向一个 常量字符串 "zhf " 的首地址,
由于 "zhf " 是一个常量字符串, 在常量区,无法修改,所以 a[1] = 'k ' 出错,它意图修改常量;
但是 a 这个指针本身是可以修改的。

char a[] = "zhf ";
定义一个 char 数组,
该数组的内容是 "zhf ", 这里有一个赋值,
"zhf " 被赋值给了这个数组, 数组中的值是可以修改的,
也就是 a[1] = 'k ' 是允许的;
但是 数组名 是const 属性的, 不能修改。

[解决办法]
char* a = "zhf "; -> const char * a = "zhf "

热点排行