char* s是一个保存了字符串首地址的指针变量。s的内容是第一个字符的地址,当s指向常量字符串时候,内容不能改变(s[1]=‘y‘;错的!因为s[1]就是第二个常量字符的地址,这个地址是唯一的,不能改变!),但是整体可以修改(s = "addd"就可以)。
char s[]是有连续内存的数组,每个元素是char类型;s2指向的内存区域的地址和容量在生命期里不会改变,但数组里存的内容可以改变。
两者在内存里都在末位存了‘\0’,但strlen()时不计‘\0’。
1 char* s1 = "hello";//长度为6,最后一个是‘\0‘ 2 char s2[] = "goodbye";//最后一个是‘\0‘ 3 4 //s1 5 cout<<s1<<endl;//输出 hello,s1保存的是第一个常量字符的地址,也是字符串名字,输出的是字符串 6 cout<<*s1<<endl;//输出h 7 cout<<s1[0]<<endl;//输出第一个字符h 8 cout<<*(s1+1)<<endl;//输出第二个字符:e 9 10 s1="hellohello";//可以整体改变 11 cout<<s1<<endl;//hellohello 12 13 //s2操作同s1类似 14 s2 = s1;//错误!!!数组不能用等号赋值(除了初始化) 15 s1 = s2;//对
作为形参完全相同:
void function(char* s1); void function(char s1[]);
为什么改变s1危险?
hello字符串是在编译时候就确定了,所以编译器知道它指的是常量,而且不希望你改变;但是数组只是个存储工具,编译时不知道它里面是什么,所以可以改。
int a=0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[]="abc"; //栈 char *p2; //栈 char *p3="123456"; //123456\0在常量区,p3在栈上。 static int c=0; //全局(静态)初始化区 p2 = (char*)malloc(20); //分配得来得10和20字节的区域就在堆区。 strcpy(p1,"123456"); //123456\0放在常量区,编译器可能会将它与p3所向"123456"优化成一个地方。 }
原文:https://www.cnblogs.com/pacino12134/p/11264416.html