本文同時發表在
先來看乙個小例子 : 編寫函式遍歷乙個整型陣列的元素,陣列最後乙個元素為-1標誌陣列的結束。
下面對題目進行一下公升級 : 編寫函式遍歷乙個指標陣列的元素,陣列最後乙個元素為null標誌陣列的結束。
#include void test_char(char *s)
}int main(void) ;
test_char(s);
return 0;
}
一執行**,臥槽崩潰了。什麼鬼。表面看起來很對啊,將陣列首位址傳遞到函式內部,然後取出每個元素儲存的字串常量位址,再輸出字串。
盯著**看了10分鐘左右我才發現錯誤 : 雖然傳遞給函式的是陣列第乙個元素的位址,即0x000(為方便起見做的假設)。但是由於函式形參是char *
型別,所以*s
操作取得是0x000-0x001之間的資料賦值給char * string,而不是陣列元素裡的內容,由於這不是字串常量的首位址,所以printf("%s\n",string);
就報錯了。而且還有一點是s++也不是指向陣列的第二個元素。因為陣列是指標陣列,存放的是字串常量的首位址,每個陣列元素是8位元組(32位機器4位元組)。而s是char *型別,s++的結果也只是0x001。
有什麼辦法讓s++指向陣列下乙個元素,並且*s取出來的是陣列元素的內容?其實將函式引數s宣告為char **即可。因為編譯器發現指標s儲存的位址指向的是char *
型別,8位元組,所以*s
取出來的是s儲存的位址 - s儲存的位址+8位元組之間的內容。(後來想想第乙個例子函式形參為int *a,需要一次取址取到資料。第二個例子為指標陣列,需要兩次取址取到資料,函式形參自然就是char **,當然這都是馬後炮了)。
}函式形參也可以宣告為char *s
,相似的還有函式形參為int a
與int *a
是等價的。
工作一年了還犯這種低階錯誤,真是有點羞愧啊。
C語言中char s 與char s的不同
首先看一下c語言中下面兩個語句的不同 char s 10 abcde char s abcde 兩者不同的關鍵點如下 1 陣列 char s 10 abcde s是乙個陣列 sizeof s 10 bytes a與 a是一樣的 abcde儲存在記憶體的棧空間中 char s 10 abcde s h...
C 手稿 函式與引數
在函式宣告中可以設定若干個預設引數,這些引數在函式呼叫時可以省略。例如 void print inta 3,intb 4 print 3 4 print 4 4 4 print 3 compile error 預設引數提供了更靈活的函式宣告。簡化函式邏輯的同時,也提供了一種擴充套件既有函式的方式。在...
char型別函式(C 入門?)
前幾天測試,本來想用char自帶的函式 然而發現自己並不是很會。1.1 strcpy 原型 char strcpy char dest,char src 功能 把從src位址開始且含有 0 結束符的字串複製到以dest開始的位址空間 返回指向dest的指標 說明 src 和 dest所指記憶體區域不...