論Go語言中指標陣列和陣列指標的不同

2021-10-09 15:56:31 字數 4544 閱讀 4250

前面已經和大家詳細的介紹了指標的用法,那麼所謂的指標陣列和陣列指標到底有何變化,之間有什麼聯絡呢?是否表示乙個意思,還是有不同含義,下面就聊聊。

首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身的大小決定,每乙個元素都是乙個指標,在32 位系統下任何型別的指標永遠是佔4 個位元組。它是「儲存指標的陣列」的簡稱。

首先它是乙個指標,它指向乙個陣列。在32 位系統下任何型別的指標永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道,具體要看陣列大小。它是「指向陣列的指標」的簡稱。

當指標表示在後的時候,說明是個指標,只是指向乙個陣列;

當指標表示在前的時候,說明它是乙個陣列,只是陣列的元素都是指標。

這樣大家應該就能明白我說的是什麼。

int

(*p)

[n]

()優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p+1時,p要跨過n個整型資料的長度。

//定義二維陣列

int a[3]

[4];

//該語句是定義乙個陣列指標,指向含4個元素的一維陣列。

int(

*p)[4]

;//將該二維陣列的首位址賦給p,也就是a[0]或&a[0][0]

p=a;

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

p++;

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

在二維陣列裡面

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

int

*p[n]

優先順序高,先與p結合成為乙個陣列,再由int*說明這是乙個整型指標陣列,它有n個指標型別的陣列元素。這裡執行p+1時,則p指向下乙個陣列元素。

下面這樣賦值是錯誤的:

p=a;

*p=a;

這裡*p表示指標陣列第乙個元素的值,也就是a的首位址的值。

如要將二維陣列賦給一指標陣列:

int

*p[3];

int a[3]

[4];

p++;

for(i=

0;i<

3;i++

)p[i]

=a[i]

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

陣列指標只是乙個指標變數,似乎是c語言裡專門用來指向二維陣列的,它占有記憶體中乙個指標的儲存空間。

指標陣列是多個指標變數,以陣列形式存在記憶體當中,占有多個指標的儲存空間。

還需要說明的一點就是,同時用來指向二維陣列時,其引用和用陣列名引用都是一樣的。

比如要表示陣列中i行j列乙個元素:

*

(p[i]

+j)、*(*

(p+i)

+j)、(

*(p+i)

)[j]、p[i]

[j]

優先順序:() > > *

下面到底哪個是陣列指標,哪個是指標陣列呢:

a)

int*p1[10]

;b)int(

*p2)[10

];

在這之前首先需要明白乙個符號之間的優先順序問題。

先分析a)中「」的優先順序比「*」要高。

p1 先與「」結合,構成乙個陣列的定義,陣列名為p1,int *修飾的是陣列的內容,即陣列的每個元素。那現在我們就好理解了,這是乙個陣列,其包含10 個指向int 型別資料的指標,即指標陣列。

再分析b)中「()」的優先順序比「」高。

「*」號和p2 構成乙個指標的定義,指標變數名為p2,int 修飾的是陣列的內容,即陣列的每個元素。陣列在這裡並沒有名字,是個匿名陣列。

那現在我們清楚p2 是乙個指標,它指向乙個包含10 個int 型別資料的陣列,即陣列指標.

如下圖所示:

舉例說明a 和&a 之間的區別,**如下:

int

main()

; char (

*p3)[5

]=&a; char (

*p4)[5

]= a;

return0;

}

p3+1 的值會是什麼?p4+1 的值又會是什麼?毫無疑問,p3 和p4 都是陣列指標,指向的是整個陣列。

&a 是整個陣列的首位址;

a是陣列首元素的首位址

其值相同但意義完全不同。

在c 語言裡,賦值符號「=」號兩邊的資料型別必須是相同的,如果不同需要顯示或隱式的型別轉換。

p3 這個定義的「=」號兩邊的資料型別完全一致,而p4 這個定義的「=」號兩邊的資料型別就不一致了。

左邊的型別是指向整個陣列的指標,右邊的資料型別是指向單個字元的指標。

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

把陣列長度改小點,會有什麼問題?p3+1 和p4+1 的值又是多少呢?

int

main()

; char (

*p3)[3

]=&a; char (

*p4)[3

]= a;

return0;

}

把陣列長度改大點,又會有什麼問題?

int

main()

; char (

*p3)[10

]=&a; char (

*p4)[10

]= a;

return0;

}

這時p3+1 和p4+1 的值又是多少呢?

得到的結果:

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

必須使用強制轉換,如:

char (

*p2)[5

]=(char (*)

[5])a;

error c2440:

'initializing'

: cannot convert from 'char (*)[5]' to 'char (*)[3]'

error c2440:

'initializing'

: cannot convert from 'char (*)[5]' to 'char (*)[10]'

(3).把以上程式更改後成功執行**如下:

int

main()

; char (

*p1)[5

]=&a; char (

*p2)[5

]=(char (*)

[5])a;

printf

("a=%d\n"

,a);

printf

("a=%c\n"

,a[0])

;printf

("p1=%c\n",*

*p1)

;printf

("p2=%c\n",*

*p2)

;printf

("p1+1=%c\n",*

*(p1+1)

);printf

("p2+1=%c\n",*

*(p2+1)

);return0;

}

執行結果:

a=

1638208

a=ap1=a

p2=a

p1+1

=?p2+1=?

press any key to continue

後面的結果可以自己去試試看,得到的是什麼。

結論:

根據指標型別及所指物件,表示指標大小,每次加1,表示增加指標型別大小的位元組.

C語言中指標和陣列

首先,明確乙個概念,指標是什麼,一旦提到這個老生常談且富有爭議性的話題,那真是1000個人有1000種看法。在國內的很多教材中,給出的定義一般就是 指標就是位址 從初步理解指標的角度來說,這種說法是最容易理解的,但是這種說法明顯有它的缺陷所在。指標就是位址 這種說法相當於 指標 字面值位址 或者說乙...

C語言中指標陣列與陣列指標

1 指標陣列的實質是乙個陣列,這個陣列中儲存的內容全部是指標變數。2 陣列指標的實質是乙個指標,這個指標指向的是乙個陣列。1 int p 5 int p 5 int p 5 2 一般規律 int p p是乙個指標 int p 5 p是乙個陣列 3 如果核心和 結合,表示核心是指標 如果核心和 結合,...

go 指標陣列 go語言中的指標陣列

宣告乙個包含有5個整數指標型別的陣列,我們可以在初始化時給相應位置的元素預設值。下面是給索引為0的元素乙個新建的的int型別指標 預設為0 給索引為1的元素指向值v的位址,剩下的沒有指定預設值的元素為指標的zero值也就是nil package main import fmt func main f...