指標和陣列小記

2021-09-13 02:44:51 字數 2462 閱讀 3571

dsaa in c 看到hash table的建立,對figure5.8的程式中二級指標、一級指標和陣列下標的用法有些疑惑,梳理一下指標和陣列的關係。

寫段**看看:

int

main()

在gdb中看看幾個值:&a是0xbfffef7c,pa也是0xbfffef7c,而a是。

(gdb) p &a$1=

(int (*)

[2]) 0xbfffef7c

(gdb) p pa$2=

(int *) 0xbfffef7c

(gdb) p a$3=

但是在程式中卻寫的是pa = a;?若寫成pa = &a則編譯告警,執行出錯。如何理解呢?

參考陣列名和陣列名取位址的區別這篇文章以及《c和指標》:

首先引用《c和指標》p141中的理論:

在c中, 在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第乙個元素的位址。 它的型別取決於陣列元素的型別: 如果它們是int型別,那麼陣列名的型別就是「指向int的常量指標「。

而在《c和指標》p142中說到,在以下兩中場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符&的運算元時。 sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。 取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量的指標。

所以&a後返回的指標便是指向陣列的指標,跟a(乙個指向a[0]的指標)在指標的型別上是有區別的。

由於pa是乙個int型指標,所以它可以幅值為a(乙個指向a[0]的指標,a[0]是int),即pa = a;但是&a是乙個指向陣列的指標,因此不能pa = &a

那麼&a可以賦值給誰呢?當然是乙個指向陣列的指標,比如int (*p)[2];,定義了乙個指向陣列的指標p(也稱為陣列指標),指向乙個int型一維陣列,這個陣列的長度為2,然後就可以p = &a;了。在gdb中看一下:

(gdb) p p$4=

(int (*)

[2]) 0xbfffef7c

...(gdb) p &a[0]

$10=

(int *) 0xbfffef7c

發現pa&a[0]&ap的值均為0xbfffef7c,但是要注意它們的含義:&a[0]pa是a[0]的位址,&ap則是整個陣列a的位址,雖然位址相同,但含義不同。在k&r的5.3節中也有這樣的說法:

補充一下,雖然在含義上可以說a&a[0]是相同的,但是&a不能寫成&(&a[0])

(gdb) p &

(&a[0]

)attempt to take address of value not located in memory.

(gdb) p &a

$11=

(int (*)

[2]) 0xbfffef7c

從下標運算的角度來看,k&r的5.3節中說:

對陣列元素a[i]的引用也可以寫成*(a+i)這種形式。

&a[i]和a+i的含義也是相同的。如果pa是個指標,那麼在表示式中也可以在它的後面加下標。pa[i]與*(pa+i)是等價的。

所以可以看到,雖然上面說到&a[0]&a的值相同(但含義不同),而對於指標pa來說,&pa&pa[0]的值不同(含義也不同),&pa[0]&(*(pa+0))即為pa

(gdb) p &a

$12=

(int (*)

[2]) 0xbfffef7c

(gdb) p &a[0]

$13=

(int *) 0xbfffef7c

(gdb) p &pa

$14=

(int **) 0xbfffef6c

(gdb) p &pa[0]

$15=

(int *) 0xbfffef7c

(gdb) p pa

$16=

(int *) 0xbfffef7c

指標陣列和陣列指標

有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...

指標陣列和陣列指標

理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...

指標陣列和陣列指標

該文時自己對指標陣列用法的一點總結,還望高手指點不足原文如下 由於以前對指標陣列不太明白,所以自己寫了 乙個小的測試程式來驗證了自己的猜測,先總結如下 指標陣列,由名字就可以知道的該陣列中的成員都是為指標的。其定義的方法為 char p 5 該初定義乙個包含5個char 型別的陣列的指標,由於p本身...