為什麼C語言中的這個myputs函式不能執行?

時間 2021-09-10 01:59:41

1樓:

引數型別不對

變數型別是按右左法則來看的,從變數名往右看,看完再往左看,如此往復

char* str,str右邊是,說明str是陣列,再往左看,是*,說明陣列元素是指標

也就是str是個存放char指標的陣列

然後函式裡的引數比較特殊,陣列會退化成指標

所以這麼寫的str就是個char**而已,和傳進去的char(*)[20]不匹配。

如果編譯器沒檢查出來放你過了——當然引數不匹配是未定義行為,這裡只是說其中一種可能性。

char**的步長是sizeof(char*),而char(*)[20]的步長是sizeof(char[20])

那麼進行str[i]也就是*(str+i)的時候,+i前進的步長不對,再解引用就不知道是什麼牛鬼蛇神了。

2樓:鶴鳴

這個題目有點難度,適合做考題。

在我的編譯環境下是無法經過編譯檢查的,給出的提示如下 :

"char (*)[20]" 型別的實參與 "char **" 型別的形參不相容C/C++(167)

如果將函式的宣告改為:

void myputs(char (*strs)[SIZE], int n);

則該程式可以正常執行。

這個問題涉及到了二級指標,原函式宣告中的那個,其實只是指標的障眼法,沒有任何陣列的意義,反倒容易把人搞糊塗。如果你正確的認識到的實際意義, 那麼中間一級指標的步長計算就是個有意思的問題了: 想想 strs +1 這個表示式的值應該是多少呢?

c語言中 include stdio h , 的作用是什麼,為什麼不能去掉 ?

nullptr 表示這是預處理語句,由預處理器來處理。至於為啥是 這就是語法設計的事情了,也可以設計成 include等等。C C 標準已經規定是 開頭了,編譯器都是以檢測這個符號來做判定了,所以你如果想去掉,那麼就要去改C C 的編譯器,做乙個屬於你自己的編譯器。 程式設計思維 號表示這一行後面的...

C語言中的選擇排序?

郭建波 選擇排序的過程 陣列排序前 7 23 12 4 33 21 2 17 13 9 第一輪迴圈 2 23 12 4 33 21 7 17 13 9 第二輪迴圈4 12 23 33 21 7 17 13 9 第三輪迴圈7 23 33 21 12 17 13 9 第四輪迴圈9 33 21 12 17...

c語言中 p a什麼意思?

Flint Stone 首先 C語言 其次這是乙個指標,指標是什麼?是控制位址的指標的常用運算子 先說後面那個,你學C語言,那麼你肯定用過scanf d n 這樣的輸入吧,n是輸入到n的位址,就是取位址符,你可以試試cout n endl 輸出是乙個位址,十六進製制的。你可以找一篇部落格好好看看。定...