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....