C語言指標初識
定義指標變數
定義指標變數,在變數名前面加星號*
,格式為:
int a;
datatype *pointname; int *p; p = &a;
或者 int a;
datatype *pointname = value; int *p = &a;
定義指標變數時必須帶*
,給指標變數賦地址值時不能帶*,等於一個地址即可改變指標指向
。
1 //定義普通變數 2 float a = 99.5, b = 10.6; 3 char c = '@', d = '#'; 4 //定義指標變數5 float *p1 = &a; 6 char *p2 = &c; 7 //修改指標變數的值 8 p1 = &b; 9 p2 = &d;
p1從指向&a變為指向&b,p2從指向&c變為指向&d。
通過指標變數取得資料
指標變數儲存了資料的地址,通過指標變數能夠獲得該地址上的資料,格式為: *pointer;
這裡的*
稱為指標運算子,用來取得某個地址上的資料,
1 #include <stdio.h> 2 int main(){ 3 int a = 15; 4 int *p = &a; 5 printf("%d, %d\n", a, *p); //兩種方式都可以輸出a的值 6 return 0; 7 }
執行結果:15, 15
a的地址是0X···,p 指向 a 後,p 本身的值會變為 a的地址值0X···,*p 表示獲取地址 0X··· 上的資料,也即變數 a 的值,所以 *p 變為了取資料值。
指標除了可以獲取記憶體上的資料,也可以修改記憶體上的資料
1 #include <stdio.h> 2 int main(){ 3 int a = 15, b = 99, c = 222; 4 int *p = &a; //定義指標變數 5 *p = b; //通過指標變數修改記憶體上的資料 6 c = *p; //通過指標變數獲取記憶體上的資料 7 printf("%d, %d, %d, %d\n", a, b, c, *p); 8 return 0; 9 }
執行結果:99, 99, 99, 99
*
在不同的場景下有不同的作用:定義指標變數時的*
和使用指標變數時的*
意義完全不同。
*
可以用在指標變數的定義中,表明這是一個指標變數,以和普通變數區分開;
使用指標變數時在前面加*
表示獲取指標指向的資料,或者說表示的是指標指向的資料本身。
1 int a,b; //宣告變數 2 int *p = &a; 或者 int *p; p = &a; //定義指標 3 *p = 100; //指標賦值&a的值 4 p = &b; //改變指向 5 *p = 101; //指標賦值&b的值
1 int x, y, *px = &x, *py = &y; 2 y = *px + 5; //表示把x的內容加5並賦給y,*px+5相當於(*px)+5 3 y = ++*px; //px的內容加上1之後賦給y,++*px相當於++(*px) 4 y = *px++; //相當於y=(*px)++ 5 py = px; //把一個指標的值賦給另一個指標
1 #include <stdio.h> 2 int main(){ 3 int a = 100, b = 999, temp; 4 int *pa = &a, *pb = &b; 5 printf("a=%d, b=%d\n", a, b); 6 /*****開始交換*****/ 7 temp = *pa; //將a的值先儲存起來 8 *pa = *pb; //將b的值交給a 9 *pb = temp; //再將儲存起來的a的值交給b 10 /*****結束交換*****/ 11 printf("a=%d, b=%d\n", a, b); 12 return 0; 13 }
執行結果:
a=100, b=999
a=999, b=100
關於 * 和 & 的謎題
假設有一個 int 型別的變數 a,pa 是指向它的指標,那麼*&a
和&*pa
分別是什麼意思呢?*&a
可以理解為*(&a)
,&a
表示取變數 a 的地址(等價於 pa),*(&a)
表示取這個地址上的資料(等價於 *pa),繞來繞去,又回到了原點,*&a
仍然等價於 a。&*pa
可以理解為&(*pa)
,*pa
表示取得 pa 指向的資料(等價於 a),&(*pa)
表示資料的地址(等價於 &a),所以&*pa
等價於 pa。
對星號*
的總結
在我們目前所學到的語法中,星號*
主要有三種用途:
- 表示乘法,例如
int a = 3, b = 5, c; c = a * b;
,這是最容易理解的。 - 表示定義一個指標變數,以和普通變數區分開,例如
int a = 100; int *p = &a;
。 - 表示獲取指標指向的資料,是一種間接操作,例如
int a, b, *p = &a; *p = 100; b = *p;
。