C的字符指針

首先來個小例子。寫strcpy時的一個小錯誤。代碼如下:

void mystrcpy(char* ch1,char* ch2)
{
for (int i=0;ch2[i]!='\0';i++)
{
ch1[i]=ch2[i];
}
ch1[i+1]='\0';
}
最後那個i+1就不用了,直接用i。忘記i已經在循環里加過了。
 

順便問一下,用這種方式爲什麼也能正常打印:
void mystrcpy(char* ch1,char* ch2)
{

int i=0;

while((ch1[i]=ch2[i])!='\0'){i++;}

}
這種方式沒看到在那裏加'\0'結束啊。看到的希望可以指教指教。

 

  1. 以字符串形式出現的,編譯器都會爲該字符串自動添加一個0作爲結束符,如在代碼中寫 
  2.  
  3. "abc",那麼編譯器幫你存儲的是"abc\0" 
  4.  
  5. "abc"是常量嗎?答案是有時是,有時不是。 
  6.  
  7.   不是常量的情況:"abc"作爲字符數組初始值的時候就不是,如 char str[] = "abc"; 
  8.  
  9.   因爲定義的是一個字符數組,所以就相當於定義了一些空間來存放"abc",而又因爲 
  10.  
  11.   字符數組就是把字符一個一個地存放的,所以編譯器把這個語句解析爲
  12.  
  13.     char str[3] = {'a','b','c'}; 
  14.  
  15.   又根據上面的總結1,所以char str[] = "abc";的最終結果是 
  16.  
  17.   char str[4] = {'a','b','c','\0'}; 
  18.  
  19.   還有,如果char str[] = "abc";是在函數內部寫的話,那麼這裏 
  20.  
  21.   的"abc\0"因爲不是常量,所以應該被放在棧上。 
  22.   
  23.   是常量的情況:  把"abc"賦給一個字符指針變量時,如 char* ptr = "abc"
  24.  
  25.   因爲定義的是一個普通指針,並沒有定義空間來存放"abc",所以編譯器得幫我們 
  26.  
  27.   找地方來放"abc",顯然,把這裏的"abc"當成常量並把它放到程序的常量區是編譯器 
  28.  
  29.   最合適的選擇。所以儘管ptr的類型不是const char*,並且ptr[0] = 'x';也能編譯 
  30.  
  31.   通過,但是執行ptr[0] = 'x';就會發生運行時異常,因爲這個語句試圖去修改程序 
  32.  
  33.   常量區中的東西。
  34.  
  35.   char* ptr = "abc";這種寫法原來在c++標準中是不允許的, 
  36.  
  37.   但是因爲這種寫法在c中實在是太多了,爲了兼容c,不允許也得允許。雖然允許,
  38.  
  39.   但是建議的寫法應該是const char* ptr = "abc";這樣如果後面寫ptr[0] = 'x'的 
  40.  
  41.   話編譯器就不會讓它編譯通過,也就避免了上面說的運行時異常。
  42.  
  43.   又擴展一下,如果char* ptr = "abc";寫在函數體內,那麼雖然這裏的"abc\0"被 
  44.  
  45.   放在常量區中,但是ptr本身只是一個普通的指針變量,所以ptr是被放在棧上的,
  46.  
  47.   只不過是它所指向的東西被放在常量區罷了。 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章