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