char *a = {"hello"}; 跟char *a = "hello"的区别
,哪个是字符串,那个是字符串数组,另外char*a={"hello"}为什么不能修改,大神讲下字符串和字符数组的区别吧...
,哪个是字符串,那个是字符串数组,另外 char *a = {"hello"}为什么不能修改,大神讲下字符串和字符数组的区别吧
展开
展开全部
你这个两个都是字符串。字符串数组char* a[]={"hello","world",NULL}; 这种读法大概可以这样认为,a先和[]构成一个数组,然后数组存放的内容是char*,也就是字符串,联合起来就构成了字符串数组。
char* a={"hello"}为什么不能修改,这个要涉及进程占用的内存分段,大概分为代码区,只读区,全局区,堆区,栈区。"hello"作为一个字符串字面值,是被放在只读区,只读顾名思义就是不能修改的。char* a="hello",相当于把hello的地址赋给了a,故而不能对a指向的内容进行修改。char a[]="hello",这样赋值的就是一个字符数组。字符数组a是在栈区里申请的一个空间给a,然后把只读区的"hello"进行了一次复制再赋值给a,这样a的指向是能修改的。
char* a={"hello"}为什么不能修改,这个要涉及进程占用的内存分段,大概分为代码区,只读区,全局区,堆区,栈区。"hello"作为一个字符串字面值,是被放在只读区,只读顾名思义就是不能修改的。char* a="hello",相当于把hello的地址赋给了a,故而不能对a指向的内容进行修改。char a[]="hello",这样赋值的就是一个字符数组。字符数组a是在栈区里申请的一个空间给a,然后把只读区的"hello"进行了一次复制再赋值给a,这样a的指向是能修改的。
展开全部
从语法意义上讲,二者不太一样。但从使用角度来讲,就这个具体表达式,效果是一样的。
二者都是先生成一个常字符串,然后把其首地址(就是字母h的地址)赋给指针p。前者的{}在这里只有“板块”的意思了,所以与没有一样;后者你清楚。二者定义的字符串都是“常字符串”,不能修改。这没有“为什么”,就是这么规定的;想让其可变,就不要定义常量,用char a[]="hello";即可。char a[]="hello"的意思是声明一个数组a,并用一个字符串的“hello"的各位给a的各位对应赋值,并在最后加一位'\0'。
二者都是先生成一个常字符串,然后把其首地址(就是字母h的地址)赋给指针p。前者的{}在这里只有“板块”的意思了,所以与没有一样;后者你清楚。二者定义的字符串都是“常字符串”,不能修改。这没有“为什么”,就是这么规定的;想让其可变,就不要定义常量,用char a[]="hello";即可。char a[]="hello"的意思是声明一个数组a,并用一个字符串的“hello"的各位给a的各位对应赋值,并在最后加一位'\0'。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
char *str0 = "1234"; //strlen(str0) = 4,sizeof(str0) = 4
char *str1 = "1234\0"; //strlen(str1) = 4,sizeof(str1) = 4
char str2[] = "1234"; //strlen(str2) = 4,sizeof(str2) = 5
以上是在VC++ 6.0环境下的测试结果,这里体现了strlen()和sizeof的区别。
严格地的活,str0和str1是指针,str2是数组,这是其定义方式决定的。
二者的共同点是:
1、都不能改变变量的指向,即str0、str1和str2都不能作为左值(=左边的变量);
2、作为函数参数都会被当作指针看待;
不同点是:
1、在用关键字sizeof计算长度时,数组长度会比字符串长度大1。
2、作为外部变量,char s[]在另一个(或多个)磁盘文件中,不能用char *s来指向s[],反之亦然。
char *str1 = "1234\0"; //strlen(str1) = 4,sizeof(str1) = 4
char str2[] = "1234"; //strlen(str2) = 4,sizeof(str2) = 5
以上是在VC++ 6.0环境下的测试结果,这里体现了strlen()和sizeof的区别。
严格地的活,str0和str1是指针,str2是数组,这是其定义方式决定的。
二者的共同点是:
1、都不能改变变量的指向,即str0、str1和str2都不能作为左值(=左边的变量);
2、作为函数参数都会被当作指针看待;
不同点是:
1、在用关键字sizeof计算长度时,数组长度会比字符串长度大1。
2、作为外部变量,char s[]在另一个(或多个)磁盘文件中,不能用char *s来指向s[],反之亦然。
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐于2017-09-09 · 知道合伙人软件行家
关注
展开全部
没什么区别,是一样的意思,只不过是初始化的写法略有不同而已。加与不加大括号对于此时没什么影响,a都是指向"hello"的指针。
如同 int n={2}; 和 int n=2;一样。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这个要分两部分看,第一个部分等号前的部分char *a,这个的意思就是定义了一个指针。
后面的部分{"hello"},就是定义了一个数组,而"hello"则是一个字符串。
我们平时定义char a[] 这里的数组名其实也是一个指针。
结合起来看{"hello"},a是一个指针,指向的是数组的第一个元素的地址,即是“hello”这个元素的地址。
后面的部分{"hello"},就是定义了一个数组,而"hello"则是一个字符串。
我们平时定义char a[] 这里的数组名其实也是一个指针。
结合起来看{"hello"},a是一个指针,指向的是数组的第一个元素的地址,即是“hello”这个元素的地址。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询