今天在看書上的一段代碼的時候發現有一段代碼有問題,對於那段代碼的錯誤進行一下解釋。
並加強一下我們常用的兩種定義字符串的方法的一些區別進行一下解釋。
書上的錯誤代碼大概如下:
#include<stdio.h> void copy(char *x,char *y) { for(;*y!='\0';x++,y++) *x=*y; *x='\0';
printf("%s\n",a); } int main() { char *a="Hello!"; char *b="World!"; copy(a,b); return 0; }
字符數組和字符串指針都可以用來存儲字符串。
但是字符數組和字符串有本質的區別。
#include<stdio.h> int main() { char a[10]="Hello!"; char *b="world!"; printf("a=%x\n",a); printf("&a[0]=%x\n",&a[0]); printf("b=%x\n",b); printf("&b=%x\n",&b); }
a=9ffe40 &a[0]=9ffe40 b=404000 &b=9ffe38
通過輸出我們可以看出來字符數組 a 是一個地址 這個地址就是這段字符數組的首地址 &a 和 &a[0] 都是字符數組的首地址。
而字符串指針 指針變量b 是用來存一段字符串的首地址 &b 就是對着這個指針變量中的數據存儲的地址了。
我們對於字符數組可以進行單個字符的改變,因為字符數組就是一堆由字符組成的數組,所以我們對其中一個元素進行修改。
但是字符串指針就是將一個字符類型的指針變量指向了一段字符串,這段字符串是存儲在靜態數據,對於這些已經定義好的常量我們不能進行隨意的修改。
char *a="Hello!"; char *a; a="Hello!";
這兩種的定義效果是一樣的如果我們分開看就會看的更明白。
字符串指針指向的那一段字符串不能用其他字符串進行替換。
所以說到這里也就明白了書中程序的錯誤位置和原因了。
*a=*b; *a='\0';
這兩個語句都是錯誤的 字符串指針不能通過這種方式進行修改。這明顯是一個錯誤的代碼。
為了實現這種效果我可以有很多的寫法在這里舉幾個例子:
#include<stdio.h> void copy(char *a,char *b) { a=b; printf("%s\n",a); } int main() { char *x="Hello!"; char *y="World!"; copy(x,y); }
這個例子就是直接把b的地址賦給了a這樣 a,b姐都指向了同一個字符串,同樣起到了賦值的作用。
#include<stdio.h> void copy(char a[],char b[]) { int i=0; for(i=0;i<sizeof(b);i++) { a[i]=b[i]; } printf("%s\n",a); } int main() { char x[]="Hello!"; char y[]="World!"; copy(x,y); }
這個方法就是定義的時候定義字符數組這樣就可以實現一個字符一個字符的賦值了。
所以說書上的也不一定都對,編程這種東西永遠沒有唯一的正確答案,實現一個功能不同的人編都有不同的代碼實現的方法也不相同。
所以多動動手,對每一個代碼都抱有質疑的態度,沒有絕對的權威,去自己摸索更多新的東西這樣才能有更大進步,永遠踩着別人的腳印走永遠不能超過別人。