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中的理論:由於pa是乙個int型指標,所以它可以幅值為a(乙個指向a[0]的指標,a[0]是int),即在c中, 在幾乎所有使用陣列的表示式中,陣列名的值是個指標常量,也就是陣列第乙個元素的位址。 它的型別取決於陣列元素的型別: 如果它們是int型別,那麼陣列名的型別就是「指向int的常量指標「。
而在《c和指標》p142中說到,在以下兩中場合下,陣列名並不是用指標常量來表示,就是當陣列名作為sizeof操作符和單目操作符&的運算元時。 sizeof返回整個陣列的長度,而不是指向陣列的指標的長度。 取乙個陣列名的位址所產生的是乙個指向陣列的指標,而不是乙個指向某個指標常量的指標。
所以&a後返回的指標便是指向陣列的指標,跟a(乙個指向a[0]的指標)在指標的型別上是有區別的。
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]
、&a
和p
的值均為0xbfffef7c,但是要注意它們的含義:&a[0]
和pa
是a[0]的位址,&a
和p
則是整個陣列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本身...