指向陣列的指標 陣列名和指標的區別

2021-06-26 05:50:51 字數 1586 閱讀 9168

int main() ;

ptr = &arr;

return 0;

}

以上**會報錯,因此指向陣列的指標必須指明arr的大小,即

int (*ptr)[5];

再來看一下sizeof 

int main() ;

ptr = &arr;

int s1 = sizeof(arr); //20

int s2 = sizeof(ptr); //4

return 0;

}

「陣列名被改寫成乙個指標的引數」規則並不是遞迴定義的。陣列的陣列會被改寫成「陣列的指標」而不是「指標的指標」

以下轉一篇好文:  

我相信很多人都跟我一樣被某些書害的不淺,在c語言中一直還把指標跟陣列名混為一談。其實它們跟本就是兩樣的東西,指標就是指標,陣列就是陣列,網上也有很多大牛作過很多非常深入的討論,但是個人感覺有時候把問題想得太複雜了反而不好,尤其是對於新手,因為我們新手很難搞懂編譯器揹著我們到底都幹了些什麼。我們有時候應該透過現象看本質,但有時候也不要太鑽牛角尖,一口吃不出個胖子,必要時「難得糊塗」,站在抽象的角度去看事情,很多所謂的「本質」歸根到底就是「規則」,讓我們返樸歸真看看標準是怎麼說的,對於新手關於陣列和指標的區別和以及什麼時候「相同」只要記住《c專家程式設計》中提到的三個標準和三個例外就可以了:

規則1."表示式中的陣列名被編譯器當作乙個指向該陣列第乙個元素的指標。"

規則2."下標總是與指標的偏移量相同。

規則3."在函式引數的宣告中,陣列名被編譯器當作指向該陣列的第乙個元素的指標。"

在下列的情況下,對陣列的引用不能用指向該陣列第乙個元素的指標來代替:

例外1.陣列作為sizeof()的運算元,顯然此時需要的是整個陣列的大小,而不是所指向第乙個元素的大小

例外2.使用&操作符取陣列的位址

例外3.陣列是乙個字串常量初始化值

乙個很簡單的例子:

#include char ga="

abcdrfghik";

void method(char ca)//

or char *ca

int main(void

)

另外,

「陣列名被改寫成乙個指標的引數」規則並不是遞迴定義的。陣列的陣列會被改寫成「陣列的指標」而不是「指標的指標」

比如char c[8][10]所被改寫對應的形參為 char (*)[10],為「陣列的指標」。

乙個簡單的例子:

#include #include 

method(

int a[3][2

]) }

for(i=0;i<=2;i++)

}int k=0

;

for(k=0;k<=5;k++)

}int main(void

),,};

method(a);

return0;

}

至於更深層的知識水到自然渠成。

陣列名和指標

c c 陣列名與指標區別深層探索 看了這篇文章之後,終於將混淆了很久的概念搞清楚了。1 陣列名的內涵在於其指代的實體是一種資料結構,其資料結構就是陣列 2 陣列名的外延在於其可轉換為指向其指代實體的指標,而且是乙個指標常量 3 指向陣列的指標則是另外一種變數型別,僅僅意味著陣列的存放位址。陣列名在作...

陣列名和指標

問 陣列名不是首元素的指標咩,為什麼sizeof陣列名能夠知道陣列長度?答案 陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 這種誤解的根源在於國內某著名的c程式設計教程...

陣列名和指標

參考 參考 int array 10 array 錯,只有當陣列退化為指標才能有自增操作。因為1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3....