C++中字符数组和字符指针问题

环境:vs2010html

说明:在阅读这部份内容以前应该先明确C++内存分配问题 ,那一篇文章说的比较清楚。java

1.字符数组,初始化:数组

char str1[]="abc";
char str1[]={"abc"};
char str1[]={'a','b','c','\0'};//若是没有\0,运行经过,但有不能够意料的结果
char str1[5]="abc";//字符数量<5,由于必须包含尾巴\0

一些操做:spa

str1[1]='g';//更改字符串中某个值
cout<<str1;//输出字符串
printf("%s",str1);
strcpy(str1,"123");//字符串拷贝
str1="456";//更改字符串

一些正确使用和错误使用对比:指针

*str1="bcd";//错误,*str仅仅是指向字符串的首指针,所以*str1表明第一个字符,code

*str1='1';//正确,更改第一个字符,字符串str1变为“1bc”htm

*str1++;//错误,这是char *str1的用法blog

2.字符指针,初始化:内存

char *str2="123";字符串

char *str2=NULL;

char *str2=0;//同上一个,置为空

字符指针一些操做:

cout<<str2;//输出字符串
printf("%s",str2);
//strcpy(str2,"123");//错误,指针字符串不能拷贝,
str2="456";//更改字符串正确方法!!!

一些错误操做:

*str2="asdf";//错误,str2指向常量数据区,这样不能更改字符串

strcpy(str2,"123");//错误,不能这样拷贝,常量数据区没法更改

*str2='q';//错误。同第一个,这更改的str2指向的常量数据区,而常量数据区是不能更改的!

 

PS1:因而可知字符数组和指针数组仍是有不少类似的地方!也就是说,还有不少不一样的地方(o(╯□╰)o废话)

 PS2:*str2 = "asdf";中的str2为何会指向内存常量区域呢?是由于编译器会在指针初始化时把*str2指向的内容当作常量处理,进而放在常量区域,所以不能修改。其实,编译器在给字符指针*str2赋值"123"时,会先查询常量区域是否有"123",若是有,会在栈中(假设是普通变量)生成一个直接指向这个常量地址的指针;若是没有,会先在常量区域生成"123"字符串,再在栈中生成一个指向这个常量地址的指针。这里要区别与new一个字符串的区别(new一个会在堆内存中分配一个新的"123",无论之前有没有,java中的String保留了这个规则,而且特别注意,C++中堆内存分配后,要用对应的delete/free释放内存!)。

相关文章
相关标签/搜索