我們知道,訪問乙個變數的內容的實質就是訪問記憶體,訪問乙個變數可以通過變數名訪問,也可以通過指標來訪問。如下的兩種操作printf結果是一樣的:
#include
int main(void)
結合上一章提到的,int a[10] ; 中a就表示陣列的首位址,那麼我們定義int *p,就可以賦值為p = a;那麼可以通過*p來訪問陣列了,這樣陣列和指標就建立了聯絡。同樣的,我們可以直接把a作為乙個指標來用,可以*a來訪問陣列元素。
#include
int main(void)
; printf("*a = %d;\n",*a);
return
0;}
結果:
root@ubuntu
:/mnt/hgfs/share/code/c_adcance/priner
# ./a.out
*a = 1;
(1)陣列的特點就是:陣列中的各個元素位址是依次相連線的,而且陣列必須是一種資料型別。
(2)陣列占用位址連續的一片記憶體空間,只要知道其中乙個陣列元素的位址,就可以推算出其他陣列元素的位址。這個特點特別好用指標去是實現。
(1)int *p ; int a[5]; p = a ;//型別匹配
(2)int *p; int a[5]; p = &a; //型別不匹配
(3) 雖然&a 、a 、 &a[0] 三個表示方式從數值上來看是完全相等的,但是其表示的意義不一樣。a和&a[0]表示的陣列元素的首位址,而&a表示的是整個陣列的首位址。從型別上來看:a、&a[0]是元素的指標,是int 型別的;而&a是陣列指標,是int ()[5]。
(1)指標參與運算時,因為指標變數本身儲存的數值是表示位址的,所以運算也是位址的運算。
(2)指標參與運算的特點是,指標變數+1,並不是位址真的+1,而是+1*sizeof[指標型別];如果是int 型別,則+1實際是位址+4,如果是char 型別的指標,則+1則表示位址+1;如果是double *型別的指標
,則就表示位址+8。
(3)指標變數+1時,實際不是+1而是+sizeof[指標型別],主要原因是希望指標+1後剛好指向下乙個元素(當然不希望錯位了)。這樣在指標操作時就非常方便。
總結一下,**體現:
#include
int main(void)
; int
*p; p = a;
printf("*p = %d. \n", *p);
printf("p = %p. \n", p);
printf("*(p+1) = %d. \n", *(p+1));
printf("((unsigned int)p+1) = %x. \n", ((unsigned int)p+1));
printf(" *(char *)((unsigned int)p+1) = %d. \n", *(char *)((unsigned int)p+1));
printf(" *(int *)((unsigned int)p+1) = %d. \n", *(
int*)((unsigned int)p+1));
return
0;}
當能分析出列印結果時,表明指標和陣列的初步結合就已經搞明白了。列印如下:
root@ubuntu
:/mnt/hgfs/share/code/c_adcance/priner
# gcc array_pointer.c
root@ubuntu
:/mnt/hgfs/share/code/c_adcance/priner
# ./a.out
*p = 1.
p = 0xbf9355dc.
*(p+1) = 2.
((unsigned int)p+1) = bf9355dd.
*(char *)((unsigned int)p+1) = 0.
*(int *)((unsigned int)p+1) = 33554432.
指標和陣列小結
指標在32位程式中佔4個位元組,在64位程式中佔8個位元組。陣列指標 int p 10 指標陣列 int a 10 1 一維陣列int a 4 如上面的陣列a,a為陣列名,代表陣列首元素的位址,其本質是位址,所以可以將其看為普通的指標。a,代表陣列的位址,可以將其看成陣列指標。2 二維陣列int a...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標陣列和陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...