日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言指针变量的定义和使用

發布時間:2025/3/12 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言指针变量的定义和使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

指針變量的含義

數據在內存中的地址也稱為指針,如果一個變量存儲了一份數據的指針,我們就稱它為指針變量

在C語言中,允許用一個變量來存放指針,這種變量稱為指針變量。指針變量的值就是某份數據的地址,這樣的一份數據可以是數組、字符串、函數,也可以是另外的一個普通變量或指針變量。

定義指針變量

定義指針變量與定義普通變量非常類似,不過要在變量名前面加星號*,格式為:

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 賦值時,因為已經知道了它是一個指針變量,就沒必要多此一舉再帶上*,后邊可以像使用普通變量一樣來使用指針變量。也就是說,定義指針變量時必須帶*,給指針變量賦值時不能帶*。

假設變量 a、b、c、d 的地址分別為 0X1000、0X1004、0X2000、0X2004,下面的示意圖很好地反映了 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; }

運行結果:

15, 15

假設 a 的地址是 0X1000,p 指向 a 后,p 本身的值也會變為 0X1000,*p 表示獲取地址 0X1000 上的數據,也即變量 a 的值。從運行結果看,*p 和 a 是等價的。

CPU 讀寫數據必須要知道數據在內存中的地址,普通變量和指針變量都是地址的助記符,雖然通過 *p 和 a 獲取到的數據一樣,但它們的運行過程稍有不同:a 只需要一次運算就能夠取得數據,而 *p 要經過兩次運算,多了一層“間接”。

使用指針是間接獲取數據,使用變量名是直接獲取數據,前者比后者的代價要高。

指針除了可以獲取內存上的數據,也可以修改內存上的數據。

示例

#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; }

運行結果:

99, 99, 99, 99

*p 代表的是 a 中的數據,它等價于 a,可以將另外的一份數據賦值給它,也可以將它賦值給另外的一個變量。

*在不同的場景下有不同的作用:可以用在指針變量的定義中,表明這是一個指針變量,以和普通變量區分開;使用指針變量時在前面加表示獲取指針指向的數據,或者說表示的是指針指向的數據本身。

也就是說,定義指針變量時的和使用指針變量時的意義完全不同。以下面的語句為例:

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; }

運行結果:

a=100, b=999 a=999, b=100

從運行結果可以看出,a、b 的值已經發生了交換。需要注意的是臨時變量 temp,它的作用特別重要,因為執行*pa = *pb;語句后 a 的值會被 b 的值覆蓋,如果不先將 a 的值保存起來以后就找不到了。

關于 * 和 & 的謎題

假設有一個 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;。

總結

以上是生活随笔為你收集整理的C语言指针变量的定义和使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。