首页 > 其他 > 详细

char* 和 cha[]

时间:2019-07-29 17:17:53      阅读:129      评论:0      收藏:0      [点我收藏+]

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"优化成一个地方。
 }

 

char* 和 cha[]

原文:https://www.cnblogs.com/pacino12134/p/11264416.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!