陣列是變數,變數名代表整個變數,主要體現在取位址+1跨越的是整個變數的大小。指標變數進行運算
int (*p)[10]; //陣列指標
int *p[10]; //指標陣列
int (*p[10])(); //函式指標陣列
int (*p)(); //函式指標
int (*(*p)[10])(); //指向函式指標陣列的指標
思考這類問題,要對運算子的優先順序和結合方向有清楚的把握。從使用的角度看,越是常用的運算子優先順序越高。下標運算子優先順序高於指標運算子。
指標的定義方式為型別名 *變數名。因為指標運算子的結合方向是從右至左的,所以,我們定義的是指標變數。型別視情況而定。如下所示。
int *ar[10]; //指標陣列
int* (*p)[10] = &ar; //指向指標陣列的指標
int* (&a)[10] = ar; //對指標陣列的引用
int**s = ar; //指向陣列首元素的指標
陣列理解為一種聚合型別,實際上並不存在陣列型別,但是我們理解有這樣的一種型別。物以類聚人以群分,陣列中的所有元素型別是一樣的。二維陣列容納一維陣列的行為理解為以一維陣列作為其元素。
int ar[3][4]; /定義乙個二維陣列
int(*p)[3][4] = &ar; //指向二維陣列的指標
int(&a)[3][4] = ar; //對二維陣列的引用
int(*s)[4] = ar; //指向一維陣列的指標
int arr[2] = ,,,,,};
int *s = (int *)&arr[0][1];
int (*p)[2] = &arr[0]; //指向一維陣列的指標。
想在函式中改變呼叫者函式體內的變數值,只能使用位址傳遞。但是我們需要警惕,傳遞位址時,a和b指向同乙個變數的特殊情況。如果不加以判斷,最終導致兩個變數值均為0。解決辦法是在在外套一層if判斷就可以。
void exchange(int *a, int *b)
}
void exchange(int *a, int *b)
}
陣列名和指標
c c 陣列名與指標區別深層探索 看了這篇文章之後,終於將混淆了很久的概念搞清楚了。1 陣列名的內涵在於其指代的實體是一種資料結構,其資料結構就是陣列 2 陣列名的外延在於其可轉換為指向其指代實體的指標,而且是乙個指標常量 3 指向陣列的指標則是另外一種變數型別,僅僅意味著陣列的存放位址。陣列名在作...
陣列名和指標
問 陣列名不是首元素的指標咩,為什麼sizeof陣列名能夠知道陣列長度?答案 陣列名與指標有太多的相似,甚至很多時候,陣列名可以作為指標使用。於是乎,很多程式設計者就被搞糊塗了。而許多的大學老師,他們在c語言的教學過程中也錯誤得給學生講解 陣列名就是指標 這種誤解的根源在於國內某著名的c程式設計教程...
陣列名和指標
參考 參考 int array 10 array 錯,只有當陣列退化為指標才能有自增操作。因為1.sizeof操作符的結果型別是size t,它在標頭檔案中typedef為unsigned int型別。該型別保證能容納實現所建立的最大物件的位元組大小。2.sizeof是算符,strlen是函式。3....