char*与char[]

时间:2023-12-27 12:44:13

char *s1="hello";   // 指向常量区

char s2[]="hello";   // 指向数组的内存空间

char *s1 的s1是指针,指针是指向一块内存区域,它指向的内存区域的大小可以随时改变,而且当指针指向常量字符串时,它的内容是不可以被修改的,否则在运行时会报错。
char s2[]的s2 是数组对应着一块内存区域,其地址和容量在生命期里不会改变,只有数组的内容可以改变。

char s2[] = "hello";”是在栈中申请了额外的空间保存"hello",也就是说,现在有2个"hello"字符串,分别保存在栈中和常量存储区。

s1=s2;   // ok

s2=s1   // error

同样在使用strcpy时 strcpy(s2,s1)是可以通过的,而由于s1是t指向字符常量不能修改,strcpy(s1,s2)是不能通过的。

在char*s1=s2 时,编译器自动转换成 char*s1=&s2,两式等同。

给双指针赋值二者区别

char*s1="Hello";
char s2[]="world";
char **s3=&s1; //char **s4=s2; ERROR char *s4=s2;
char **s5=&s4;
cout<<*s3<<" "<<*s5;

输出“ Hello World”,char[]要经过两步赋值。

在函数中返回 char* 和 char[]的区别:

返回char*指向常量区,函数结束后可继续存在。

char[],栈中函数结束回收,返回乱码,要返回可在函数内用 static 声明char[]