C C 陣列指標和指標陣列

2021-09-10 10:48:14 字數 3151 閱讀 3676

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

指標陣列:首先它是乙個陣列,每乙個元素都是乙個指標。

陣列指標:首先它是乙個指標,它指向乙個陣列。它是"指向陣列的指標"的簡稱。

運算子的優先順序關係:()

>

> *

陣列指標(也稱行指標)

例如:int (*p)[n];

根據優先順序,先看( )內,p是乙個指標,後面的[ ]又說明了p是乙個指向陣列的指標,

由於前面的int,所以p是乙個指向 int 型別陣列的乙個指標。

將二維陣列賦給指標:

int a[3][4];

int (*p)[4]; //該語句是定義乙個陣列指標,指向含4個元素的一維陣列。

p=a;        //將該二維陣列的首位址賦給p

p++;       //該語句執行過後,也就是p=p+1;p跨過行a[0]指向了行a[1]

所以陣列指標也稱指向一維陣列的指標,亦稱行指標。

指標陣列

例如:int *p[n];

根據優先順序,

p先與[ ]結合,所以

p是乙個陣列,再結合 *,

表明陣列裡面的元素是指標,再加上int,

說明p陣列中的元素是int型別的指標。

將二維陣列賦給指標陣列:

int *p[3];

int a[3][4];

p++;  //該語句表示p陣列指向下乙個陣列元素。

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

p[i]=a[i]

這裡int *p[3] 表示乙個一維陣列內存放著三個指標變數,分別是p[0]、p[1]、p[2]所以要分別賦值。

在二維陣列裡面

a,&a,a[0],&a[0],&a[0][0]五個值是一樣的,都指向二維陣列的首位址(起始位置)。

區別在於這五種表達方式的型別是不同的,以int a[2][3]舉例:

a是二維陣列名,是常量,存放著二維陣列的首位址,型別為二維陣列,sizeof(a)=24。

&a 二維陣列a的(首)位址,本身是乙個指標,sizeof(&a)=4,指標型別都為4。

a[0]指向二維陣列中的第一行陣列a[0],型別是一維陣列sizeof(a[0])=12。

&a[0]代表a[0]的位址,與一維陣列名a[0]值相同,但本身是指標型別sizeof(&a[0])=4。

&a[0][0]表示二維陣列中第乙個元素的位址,指標型別sizeof(&a[0][0])=4。

a和&a

之間的區別

分析如下**:

int main()

; char (*p3)[5] = &a;

char (*p4)[5] = a;

return 0;

}

上面對p3 和p4 的使用,哪個正確呢?p3+1 的值會是什麼?p4+1 的值又會是什麼?毫無疑問,p3 和p4 都是陣列指標,指向的是整個陣列。&a 是整個陣列的首位址,a是陣列首元素的首位址,其值相同但意義不同。在c

/c++

裡,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同需要顯示或隱式的型別轉換。p3 這個定義的「=」號兩邊的資料型別完全一致,而p4 這個定義的「=」號兩邊的資料型別就不一致了。左邊的型別是指向整個陣列的指標,右邊的資料型別是指向單個字元的指標。在visual c++6.0 上給出如下警告:

warning c4047: 'initializing' : 'char (*)[5]' differs in levels of indirection from 'char *'。
這裡給出了警告,可是

由於&a 和a 的值一樣,而變數作為右值時編譯器只是取變數的值,所以執行並沒有什麼問題。

雖然能執行,但不能這麼用。

現在清楚了p3 和p4 都是指向整個陣列的,那p3+1和p4+1的值就很好理解了。

測試**如下:

#include #include using namespace std;

int main()

; char (*p1)[5]= &a;

char (*p2)[5]=(char (*)[5])a;

printf("a = %p\n",&a); //%p列印陣列位址

printf("a = %c\n",a[0]);

printf("p1 = %c\n",**p1);

printf("p2 = %p\n",*p2);

printf("p1+1 = %p\n",*(p1+1)); //p1是陣列指標,陣列a的長度是5個位元組,所以p1+1將指向a[0]向後移動5個位元組的位置

結論:根據指標型別及所指物件,表示指標大小,每次加1,表示增加指標型別大小的位元組。另乙個例項

#include #include using namespace std;

int main()

; int *ptr1=(int *)(&a+1); //指向a陣列後面的記憶體單元,&a+1表示向後移16個儲存單元

int *ptr2=(int *)(a+1); //表示a的儲存單元的位址增加乙個位元組

printf("%d,%d",ptr1[-1],*ptr2); //ptr1[-1]其實指向的是a陣列的最後乙個單元

其記憶體布局如下圖:

參考:

C C 指標陣列和陣列指標

這兩個名字不同當然所代表的意思也就不同。我剛開始看到這就嚇到了,主要是中文太博大精深了,整這樣的簡稱太專業了,把人都繞暈了。從英文解釋或中文全稱看就比較容易理解。指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an ar...

陣列指標和指標陣列

陣列指標 也稱行指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣賦值 int a 3 4 int p 4 該語句是定義乙個陣列指標,指向...

陣列指標和指標陣列

一 定義 陣列指標 陣列指標 是指向陣列 首元素的位址的 指標,其本質為指標 這個指標存放的是陣列首位址的位址,相當於2級指標,這個指標不可移動 指標陣列 陣列元素為指標的陣列,其本質為陣列。二 舉例 int a 3 4 這個無需多說,就是乙個 二維陣列 int p 4 就相當於int p 4 它就...