說出來你們可能不信,但是陣列名確實不是指標常量

2021-08-14 13:30:47 字數 1126 閱讀 6441

這篇是一篇c語言勸退流教學文,看不懂的同學應該是勸退教學流的目標物件

(寫完了才想起來注一下,本文提到的「陣列」和「陣列名」字樣,指的是陣列左值表示式(array lvalue expression)或陣列宣告(array declaration)所宣告的變數)

首先,陣列名不是常量指標,從兩方面:

1. 型別方面,陣列的型別是type[size],和常量指標型別type* const不同

2. 使用方面,sizeof(陣列名)等於陣列所有元素的大小,而不是sizeof(指標);對陣列取位址,得到的指標進行加減,增減位元組數是sizeof(陣列);你可以用字串字面量初始化乙個字元陣列,但是不能用常量指標來初始化乙個字元陣列。

其次,為什麼很多老師都說陣列是常量指標:

1. 他們不了解c語言的型別系統和隱式轉換規則

2. 他們怕下面的人聽不懂

3. 他們解釋不清為什麼陣列名不能進行賦值或者++之類的運算而指標可以

切入正題,我們從型別系統和隱式轉換規則來講:

1. 陣列名的型別就是陣列型別type[size] (參見array declaration)

對陣列取址,得到的型別是指向陣列的指標type(*)[size] (參見member access operators)

2. 陣列名在大部分情況下會隱式轉換為首元素指標右值,除了(參見 implicit conversions)

其他情況下都會發生陣列到指標隱式轉換,比如你用方括號取值,如果方括號左邊是個陣列,那麼陣列會被隱式轉換為首元素指標右值,然後對這個值進行的解引用。(參見member access operators)

更進一步,二維陣列type[size1][size2],實際上就是元素型別是陣列的陣列,進行隱式轉換後得到的首元素指標型別是type(*)[size2],指向陣列的指標,對這個指標加減,得到的也是陣列的指標,對它解引用,得到陣列。這一套過程,用那個什麼陣列名是常量指標的說法,是解釋不來的。

最後出乙個題:寫出程式輸出

typedef

char(*ap)[5];

ap foo(char* p)

return (ap)p+1;

}int main()

這個題用陣列名是指標那套理論是做不出來的。

如果愛能早點說出來

如果愛能早點說出來 歌手 山野 我站在你的門外 捧著花等著你出來 要在你見到陽光前 先給你我的愛 先向你表白 門推開陌生的對白 你和他牽手走出來 我牽強的微笑 卻只要轉身say goody 如果愛能早點說出來 你能否和我戀愛 如果我能早點說出來 你也許為我留下來 如果愛能早點說出來 心也就不在悲哀 ...

心裡有愛,就要大聲說出來

沉默是金的時代已經過去,含蓄委婉的表達,在當前喧囂的社會,已逐漸不太被人認同。青青子衿,悠悠我心 執子之手,與子偕老 的婉約在對自己喜歡的人,進行告白時,會顯得那麼的蒼白無力,倒入如說一聲 我喜歡你 來的直白。成則相扶到老,敗則咫尺天涯。歷史是由勝利者進行書寫的,雖然我們大多數人會輸在起點,但我們不...

那些沒有能夠說出來的話,只有自己明白

無論時光走得有多遠,來時的路,去時的路,還是一如既往,不會因為朝代的遷徙而變更。在漫長的歲月長河裡,許多生命都微小如沙礫,我們可以記住的,真的不多。王謝堂前燕猶在,帝王將相已作古,滄桑世事,誰主浮沉?俯瞰煙火人間,萬物遵循自然規律,安穩地成長。人的生命,與萬物相比,真是渺若微塵。96 人生是什麼,是...