1. 程式人生 > >C語言指標初識

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;

摘自http://c.biancheng.net/cpp/html/72.html