*
,格式為:
datatype *name;
或者datatype *name = value;
*
表示這是一個指針變量,datatype
表示該指針變量所指向的數據的類型 。例如:
int *p1;p1 是一個指向 int 類型數據的指針變量,至於 p1 究竟指向哪一份數據,應該由賦予它的值決定。再如:
int a = 100; int *p_a = &a;在定義指針變量 p_a 的同時對它進行初始化,並將變量 a 的地址賦予它,此時 p_a 就指向了 a。值得注意的是,p_a 需要的一個地址,a 前面必須要加取地址符
&
,否則是不對的。//定義普通變量 float a = 99.5, b = 10.6; char c = '@', d = '#'; //定義指針變量 float *p1 = &a; char *p2 = &c; //修改指針變量的值 p1 = &b; p2 = &d;
*
是一個特殊符號,表明一個變量是指針變量,定義 p1、p2 時必須帶*
。而給 p1、p2 賦值時,因為已經知道了它是一個指針變量,就沒必要多此一舉再帶上*
,後邊可以像使用普通變量一樣來使用指針變量。也就是說,定義指針變量時必須帶*
,給指針變量賦值時不能帶*
。float*
和char*
,而不是float
和char
,它們是完全不同的數據類型,讀者要引起注意。int *a, *b, *c; //a、b、c 的類型都是 int*注意每個變量前面都要帶
*
。如果寫成下面的形式,那麼只有 a 是指針變量,b、c 都是類型為 int 的普通變量:
int *a, b, c;
*pointer;
這裡的*
稱為指針運算符,用來取得某個地址上的數據,請看下面的例子:
#include <stdio.h> int main(){ int a = 15; int *p = &a; printf("%d, %d\n", a, *p); //兩種方式都可以輸出a的值 return 0; }運行結果:
#include <stdio.h> int main(){ int a = 15, b = 99, c = 222; int *p = &a; //定義指針變量 *p = b; //通過指針變量修改內存上的數據 c = *p; //通過指針變量獲取內存上的數據 printf("%d, %d, %d, %d\n", a, b, c, *p); return 0; }運行結果:
*
在不同的場景下有不同的作用:*
可以用在指針變量的定義中,表明這是一個指針變量,以和普通變量區分開;使用指針變量時在前面加*
表示獲取指針指向的數據,或者說表示的是指針指向的數據本身。*
和使用指針變量時的*
意義完全不同。以下面的語句為例:
int *p = &a; *p = 100;第1行代碼中
*
用來指明 p 是一個指針變量,第2行代碼中*
用來獲取指針指向的數據。*
。修改上面的語句:
int *p; p = &a; *p = 100;第2行代碼中的 p 前面就不能加
*
。int x, y, *px = &x, *py = &y; y = *px + 5; //表示把x的內容加5並賦給y,*px+5相當於(*px)+5 y = ++*px; //px的內容加上1之後賦給y,++*px相當於++(*px) y = *px++; //相當於y=(*px)++ py = px; //把一個指針的值賦給另一個指針
#include <stdio.h> int main(){ int a = 100, b = 999, temp; int *pa = &a, *pb = &b; printf("a=%d, b=%d\n", a, b); /*****開始交換*****/ temp = *pa; //將a的值先保存起來 *pa = *pb; //將b的值交給a *pb = temp; //再將保存起來的a的值交給b /*****結束交換*****/ printf("a=%d, b=%d\n", a, b); return 0; }運行結果:
*pa = *pb;
語句後 a 的值會被 b 的值覆蓋,如果不先將 a 的值保存起來以後就找不到了。*&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;
。