**
首先來介紹指標:在電腦科學中,指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電 腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將 位址形象化的稱為「指標」。意思是通過它能找到以它為位址的記憶體單元。
#include
intmain()
int a;
int b[10]
;
將a稱為標量,因為代表單一的值;
將b稱為陣列,代表一些值的集合。下標和陣列名一起使用,代表特定的值。如:b[0]代表第乙個元素,b[4]代表第五個元素。那麼又有問題,b[4]的型別是整形,那麼b的型別是什麼。我們可能認為它代表整個陣列,但是卻不是。在所有有陣列名的表示式中,陣列名是乙個指標常量,也就是代表陣列第乙個元素的位址。根據型別不同,如果是int型,那就是指向int的常量指標,如果是char型,那就是指向char的常量指標。
陣列和指標並不相同,陣列具有確定數量的元素,而指標只是個標量值。只有在使用陣列名時,才會為它產生乙個指標常量。
當兩種情況,陣列名不用指標常量表示--------當陣列名作為sizeof操作符或者單目操作符&的運算元:sizeof返回的是整個陣列的長度,取位址則產生的是指向陣列的指標。
請問
int a[5]
;int
*b;
可以進行a和b的互換嗎。它們都具有指標值,都可以進行間接訪問和下標引用操作。但是,他們之間還是存在很大區別。
宣告陣列,編譯器會根據給定的元素數量為陣列分配空間,然後再建立陣列名,它的值是乙個常量,指向這個陣列第乙個元素位置。宣告指標,編譯器只會為指標申請空間,而不會為任何整型值申請空間,而且指標變數並未被初始化為指向任意現有記憶體空間,甚至並未被初始化。
在上述中,表示式a,完全合法,但是b卻不合法,因為指向不確定空間,可能導致程式停止。
陣列指標(指向陣列的指標)
在《c和指標》中有這樣乙個例子:
int vector[10]
,*vp=vector;
int matrix[3]
[10],
*mp=matrix;
在上面的宣告中,為乙個整型陣列分配記憶體,並將vp宣告為乙個指向整形的指標,並將它初始化指向vector第乙個元素。
下面的宣告中,正確的建立了matrix陣列,並把mp宣告為乙個指向整形的指標,但是他的初始化卻不正確,因為matrix並不是乙個指向整形的指標,而是指向整型陣列的指標。
那麼如何正確的宣告乙個指向陣列的指標。
int (*p)[10];
我們假定它是乙個表示式對它求值。下標引用優先順序高於間接訪問,可是因為括號的存在,所以首先,p是乙個指標,接下來是下標訪問,p指向的是某種型別的陣列。但是在上面的表示式中,我們可以看到陣列的每個元素都是整數。
得到結論:p是乙個指向整型陣列的指標。
對他進行初始化
int (*p)[10]
=matrix;
p指向metrix的一行。
有兩種方式使得指標指向metrix第乙個整形元素
int
*p=&matrix[0]
[0];
int*p=matrix[0]
;//如果進行指標運算,避免下面宣告
int(
*p)[
]=matrix;
//當進行指標運算的時候,根據空陣列長度進行調整(與0相乘)
指標陣列宣告指標陣列
int
*p[10
];
下標的優先順序高於間接訪問,首先應該是個陣列,陣列中包含著十個元素,在表示式中,沒有其他操作符,所以元素型別是指向整形的指標。 簡單區分指標陣列與陣列指標
首先我們了解一下它們的定義 指標陣列 首先它是乙個陣列,其次就是陣列的元素都是指標。陣列指標 首先它是乙個指標,其次它指向乙個陣列,在32位系統下佔4個位元組。知道了定義你也那不一定會判斷,現在來舉個栗子 1 int p1 4 2 int p2 4 要根據定義區分它們兩個其實涉及了乙個符號優先順序問...
區分陣列指標與指標陣列
1.概念的區分 陣列指標 陣列的指標,首先說它是乙個指標,乙個指向陣列的指標。指標陣列 指標的陣列,它是乙個陣列,陣列中存放的內容為指標。2.優先順序的不同 優先順序為 比如int p n 因為 的優先順序最高,p先於結合,所以p是乙個指標,後面是陣列,於是這個就是陣列指標。在如int p n 優先...
函式指標,指標函式,陣列指標,指標陣列 區分
what why how 這些怎麼區分 函式指標 重點在指標,表示它是乙個指標,它指向的是乙個函式。eg int fun 指標函式 重點在函式,表示它是乙個函式,它的返回值是指標。eg int fun 陣列指標 重點在指標,表示它是乙個指標,它指向的是乙個陣列。int fun 8 指標陣列 重點在陣...