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釋放內存!)。

相關文章
相關標籤/搜索