概念:
陣列:儲存多個相同型別資料的集合
注意:
指標:
int a = 10;
int b = 20;
int *p; // 定義整型指標( 位址) 變數
p = &a; //」&」 取位址符,&a 取a 的位址
int *p1 = &a; // 等同p
*p = 100; //*p: 對p 解引用, 即為a=100;
p = &b; //p 賦值為b 的位址
*p = 200; //b = 200;
int **pp = &p; // 二級指標變數pp 賦值為p 的位址
*pp = &a; //p = &a;
**pp = 1000; //a = 1000;
*pp = &b; **pp = 2000;//b = 2000;
一、定義指標變數:型別 * 變數名;
如:int *p1, *p2;
注意: 指標變數在32 位平台(x86) 為4 個位元組
在64 位平台(x64) 為8
(1) & & 取位址運算子。
&a 是變數a 的位址
(2) * 指標運算子(「間接訪問」運算子)
如果: p 指向變數a , 則*p 就代表a 。
k=*p; ( 把a 的值 賦給k)
*p=1; ( 把1 賦給a)
三、可以用乙個指標變數指向乙個陣列元素
int a[10]=;
int *p;
p=&a[0];
注意:這裡陣列名a不代表整個陣列,只代表陣列首元素的位址。
「p=a; 」的作用是「把a陣列的首元素的位址賦給指標變數 元素的位址賦給指標變數p」而不是「把陣列 不是「把陣列a 各元素的值賦給p」。
四、引用乙個陣列元素,可用下面兩種方法:
(1) 下標法,如a[i] 形式
(2) 指標法,如*(a+i) 或*(p+i)
其中a 是陣列名,p 是指向陣列元素的指標變數,其初值p=a
兩個重要的表示式:
五、 用陣列名作函式引數時,因為 實參陣列名代表該陣列首元素的位址 ,
形參應該是乙個指標變數
注:c 編譯都是將形參陣列名作為指標變數來處理的
六、指標和陣列的不同:
1、大小不同
指標: 指標變數在32 位平台(x86) 為4 個位元組
在64 位平台(x64) 為8個位元組
陣列所佔儲存空間的記憶體:sizeof(陣列名)
陣列的大小:sizeof(陣列名)/sizeof(資料型別)
2、儲存方式不同
指標:它可以指向任何型別的資料。
指標的型別說明了它所指向位址空間的記憶體。
由於指標本身就是乙個變數,它所存放的也是變數,
所以指標的儲存空間不確定。
陣列:在記憶體中是連續存放的,開闢一塊連續的記憶體空間。
陣列是根據陣列的下標進行訪問的,
多維陣列在記憶體中是按照一維陣列訪問的,
只是在邏輯上是多維的。
陣列的儲存空間在靜態儲存區或棧上。
3、指標可以++,陣列名不可以。
七、指標的型別強轉
int main()
; int *p1 = (int *)(&arr+1);
printf("%d\n",p1[-2]); //1
int *p2 = (int *)((int *)&arr+1);
printf("%x\n",p2); //2
int *p3 = (int *)((int )&arr+1);
printf("%x\n",p3); //3
retuen 0;
}
C語言指標陣列與陣列指標
初學者總是分不出指標陣列與陣列指標的區別。其實很好理解 指標陣列 首先它是乙個陣列,陣列的元素都是指標,陣列佔多少個位元組由陣列本身決定。它是 儲存指標的陣列 的簡稱。陣列指標 首先它是乙個指標,它指向乙個陣列。在32 位系統下永遠是佔4 個位元組,至於它指向的陣列佔多少位元組,不知道。它是 指向陣...
C語言指標 指標與陣列
1 指標與一維陣列 2 指標與二維陣列 3 指標陣列與陣列指標 指標裡面最難的一種就是指標與陣列了,對於指標和二維陣列來說這裡面的關係比較複雜。牽涉到編譯器的原理和編譯過程。1 指標與一維陣列 指標是指向乙個記憶體的位址,一維陣列的陣列名代表一塊記憶體 這個陣列 的首位址,和陣列首元素的位址一樣,但...
C語言指標 指標與陣列
一 指標的運算 指標可以進行三種運算 1.指標加上整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提是a i j 存在!2.指標減去整數 如果指標p指向陣列a i 那麼指標p j 指向a i j 前提 a i j 存在!3.兩個指標相加減 兩指標必須指向同一變數!否則運算沒有意義的...