C語言的二維陣列指標 與指標陣列完全不同哦!

2021-09-19 19:15:00 字數 1796 閱讀 9340

下面這個程式和程式下面的文字可以較好的體現

#include

intmain()

,,};

int(

*p)[5]

;//此處不能去除括號!否則就不再是指向某個陣列的【指標】

//而是變成乙個存放指標的【陣列】

//即*p[5]=*(p[5]),裡面就只能存放5個指標

p=a;

//把陣列首位址a放入p中(a的位址就是a[0]的位址),所以等價於把a[0]的位址放入p

//上面兩行最好合併為int (*p)[5]=a;

printf

("*p[0] = %d\n"

,*p[0]

);printf

("a=%p\n"

,a);

//a=a[0]

printf

("a[0]=%p, p=%p\n"

,a[0

],p)

;//a[0]=p

printf

("a[1]=%p, p+1=%p\n"

,a[1

],p+1)

;//a[1]=p+1

printf

("a[2]=%p, p+2=%p\n\n"

,a[2

],p+2)

;//因為p在定義時就為int,每一行就有5個int,所以p+1實際上移動了20個int大小

printf

("sizeof(*(p+1))=%d\n\n"

,sizeof(*

(p+1))

);//*(p+1)表示的是第一行的資料,即a[0]的所有資料

printf

("a[1][1]=%d, *(p+1)[0]=%d\n"

, a[1]

[0],

*(p+1)

[0])

;//所以*(p+1)==a[1]

printf

("a[1][1]=%d, *(*(p+1)+1)=%d\n\n"

, a[1]

[1],

*(*(p+1)

+1))

;//同理,因為*(p+1)==a[1],即*(p+1)是乙個指標,那就可以通過指標的操作獲得裡面的資料

//即:*(*(p+1)+1)=a[1][1]

//*(p+1)+1外面的乙個+1是指標移動了1個int大小

printf

("sizeof(*(*(p+1)+1))=%d\n\n"

,sizeof(*

(*(p+1)+

1)))

;return0;

}

輸出為:

*p[0]

=0a=0x7ffd1feb8f00a[0

]=0x7ffd1feb8f00

, p=

0x7ffd1feb8f00a[1

]=0x7ffd1feb8f14

, p+1=

0x7ffd1feb8f14a[2

]=0x7ffd1feb8f28

, p+2=

0x7ffd1feb8f28

sizeof(*

(p+1))

=20a[1

][1]

=4,*

(p+1)[

0]=4

a[1][

1]=5

,*(*

(p+1)+

1)=5

sizeof(*

(*(p+1)+

1))=

4

參考**:

C語言二維陣列指標(指向二維陣列的指標)

二維陣列的定義 int matrix 見圖的操作那篇文章裡面的定義 或者這篇文章提供了另外一種方法。二維陣列在概念上是二維的,有行和列,但在記憶體中所有的陣列元素都是連續排列的,它們之間沒有 縫隙 以下面的二維陣列 a 為例 int a 3 4 從概念上理解,a 的分布像乙個矩陣 0 1 2 3 4...

c語言,指標與陣列 指標與二維陣列2

include typedef int tp parry1 3 define uart printf printf void f1 void a 二維陣列名 equal 指向一維陣列的指標 tp parry1 p a int q 3 a int t 2 a warning initializatio...

二維陣列 指標陣列與陣列指標

一 首先我們從字面意思理解一下什麼是指標陣列什麼是陣列指標 1 指標陣列 本質是乙個陣列,陣列中的每乙個元素是乙個指標。2 陣列指標 本質是乙個指標,而指標指向乙個陣列。二 我們該怎麼區分指標陣列和陣列指標?1 總共有三種表示形式 int p 4 和int p 4 和int p 4 表面看起來是不是...