int a[10];
int *p=null;
p=a;
其中,陣列名a
代表陣列的首位址(即&a[0]
),那麼表示式a+i
代表陣列中下標為i
元素a[i]
的位址,即&a[i]
。
還可以通過使用間接定址*
來引用陣列元素。例如:*(a+i)
表示取出首位址元素後邊第i
個元素的內容,即下標為i
的元素a[i]
。
此外,還可以通過一維陣列的指標變數p
來引用陣列a
中的元素,*(p+i)
就表示取出p+i
所指的記憶體單元內容,即元素a[i]
的值。*(p+i)
也可以用它的下表形式p[i]
來表示。
例如:
# include int main(void)
; int *p, *q, *r;
p = &a[3]; //第一種寫法
printf("*p = %d\n", *p);
q = a; //第二種寫法
q = q + 3;
printf("*q = %d\n", *q);
r = a; //第三種寫法
printf("*(r+3) = %d\n", *(r+3));
return 0;
}
輸出結果是:
*p = 4
*q = 4
*(r+3) = 4
注意:(1)與通過*(a+i)
來引用陣列元素a[i]
不同的是由於指標變數p
不一定永遠都指向陣列元素的首位址&a[0]
,因此僅當指標變數p
指向陣列元素首位址&a[0]
時,*(p+i)
才是對a[i]
的引用,否則,如果通過增1運算改變指標變數p
的指向,使p
指向a[i]
,那麼*)
就是對a[i]
的引用。
(2)陣列名a
是乙個位址常量,不能通過賦值操作改變它的值。指標變數p
是乙個變數,可以通過賦值運算改變它的值,從而使p
指向陣列中的其他元素。
(3)雖然p+1
和p++
都指向當前指標所指向單元的下乙個元素但是p+1
不改變當前指標的指向,而p++
相當於執行p=p+1
,因此p++
操作改變了指標p
的指向,表示指標變數p
向前移動使其指向下乙個元素。
(4)p+1
增加1*sizeof(指標的基型別)
。
例如:
# include int main(void)
; int *p = a;
printf("p = %d, p + 1 = %d\n", p, p+1);
return 0;
}
輸出結果是:
p = 1638196, p + 1 = 1638200
C語言學習筆記 指標 指標與二維陣列
在c語言中可將乙個二維陣列看成是由若干一維陣列構成的。如 int a 3 4 首先,可將二維陣列a看成是由a 0 a 1 a 2 三個元素組成的一維陣列,a是該一維陣列的陣列名,代表該一維陣列的首位址,即第乙個元素a 0 的位址 a 0 所以 a i 即為a i 注意這裡所謂的元素a 0 a 1 a...
C語言學習筆記 指標 指標陣列與陣列指標
指標陣列 是乙個陣列,陣列元素為指標 陣列指標 是乙個指標,指向陣列的指標 例如 int p1 5 int p2 5 對於語句int p1 5 因為 的優先順序要比 要高,所以 p1 先與 結合,構成乙個陣列的定義,陣列名為 p1,而 int 修飾的是陣列的內容,即陣列的每個元素。也就是說,該陣列包...
c語言學習之指標與一維陣列
紅色的為2018 1 3之前還未接觸到 首先說指標,指標是乙個可以指向變數位址的特殊變數,它本身有位址,但主要是指向別的變數的指標,它所儲存的變數位址在32位系統下為4位元組,也就是說計算機分配乙個記憶體位址給指標,讓它去儲存別的變數的位址,還有就是它的型別是它所指向的變數的型別,比如 int i ...