亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C 語言指針變量詳細介紹

2020-01-26 14:27:57
字體:
來源:轉載
供稿:網友

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

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

現在假設有一個 char 類型的變量 c,它存儲了字符 'K'(ASCII碼為十進制數 75),并占用了地址為 0X11A 的內存(地址通常用十六進制表示)。另外有一個指針變量 p,它的值為 0X11A,正好等于變量 c 的地址,這種情況我們就稱 p 指向了 c,或者說 p 是指向變量 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 要經過兩次運算,多了一層“間接”。

假設變量 a、p 的地址分別為 0X1000、0XF0A0,它們的指向關系如下圖所示:

程序被編譯和鏈接后,a、p 被替換成相應的地址。使用 *p 的話,要先通過地址 0XF0A0 取得變量 p 本身的值,這個值是變量 a 的地址,然后再通過這個值取得變量 a 的數據,前后共有兩次運算;而使用 a 的話,可以通過地址 0X1000 直接取得它的數據,只需要一步運算。

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

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

#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)+5y = ++*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。

對星號*的總結

在我們目前所學到的語法中,星號*主要有三種用途:

  1. 表示乘法,例如int a = 3, b = 5, c;  c = a * b;,這是最容易理解的。
  2. 表示定義一個指針變量,以和普通變量區分開,例如int a = 100;  int *p = &a;。
  3. 表示獲取指針指向的數據,是一種間接操作,例如int a, b, *p = &a;  *p = 100;  b = *p;。

以上就對 C語言指針變量的資料整理,后續繼續補充相關資料,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区二区大胆人体摄影专业网站| 亚洲欧美日韩成人| 日韩av黄色在线观看| 欧美成人自拍视频| 欧美丝袜第一区| 色综合五月天导航| 影音先锋欧美在线资源| 裸体女人亚洲精品一区| 日韩av一区在线| 91精品国产一区| 国产一区在线播放| 亚洲色图25p| 久久精品夜夜夜夜夜久久| 国产精品久久久久久久久久99| 亚洲欧美成人精品| 一本色道久久88综合亚洲精品ⅰ| 久久久久国色av免费观看性色| 欧美亚洲日本网站| 亚洲xxxxx性| 7m第一福利500精品视频| 中文字幕日韩欧美在线| 久久久久久91| 日韩精品一二三四区| 91精品国产91久久久| 成人啪啪免费看| 久久6免费高清热精品| 国产欧美亚洲精品| 国产亚洲欧美日韩精品| 日韩中文字幕在线精品| 亚洲天堂av女优| 午夜精品一区二区三区视频免费看| 欧美性黄网官网| 久久高清视频免费| 日韩电影大全免费观看2023年上| 欧美大荫蒂xxx| 日韩欧美有码在线| 91精品久久久久久久久青青| 97人人爽人人喊人人模波多| 一区二区三区无码高清视频| 日韩电影网在线| 国产激情视频一区| 国产亚洲欧洲高清| 亚洲成年人在线| 98精品国产自产在线观看| 国产精品99久久久久久久久久久久| 日韩精品中文字幕有码专区| 国产精品亚洲网站| 欧美黑人巨大精品一区二区| 亚洲人成网站999久久久综合| 国产女同一区二区| 日韩在线视频免费观看高清中文| 亚洲欧美综合图区| 久久久亚洲欧洲日产国码aⅴ| 欧美视频在线看| 久久精品2019中文字幕| 日韩有码在线电影| 欧美精品日韩三级| 国产精品电影观看| 欧美福利小视频| 国产精品精品一区二区三区午夜版| 日韩精品中文字幕在线观看| 亚洲高清福利视频| 亚洲日本欧美中文幕| 精品一区二区三区四区| 日韩av免费在线观看| 亚洲精品美女久久久| 91豆花精品一区| 97国产精品人人爽人人做| 日韩经典第一页| 亚洲精品v天堂中文字幕| 成人免费视频xnxx.com| 在线观看日韩专区| 视频在线观看一区二区| 久久久免费观看视频| 日韩av在线天堂网| 欧美日韩国产在线| 91豆花精品一区| 欧美亚洲国产日韩2020| 综合久久五月天| 久久手机精品视频| 欧美限制级电影在线观看| 国产激情999| 九色精品免费永久在线| 欧美激情精品久久久| www.久久草.com| 亚洲欧美成人一区二区在线电影| 国产日韩欧美在线观看| 亚洲欧美成人网| 国产午夜精品美女视频明星a级| 岛国精品视频在线播放| 国产精品青青在线观看爽香蕉| 国产精品91视频| 亚洲最大的免费| 日本高清视频精品| 4p变态网欧美系列| 中文字幕亚洲情99在线| 日韩免费电影在线观看| 久久香蕉精品香蕉| 日本精品久久久| 亚洲综合国产精品| 欧美国产极速在线| 欧美激情第1页| 日韩av有码在线| 中文字幕亚洲综合久久| 国产成人精品免高潮费视频| 91免费精品国偷自产在线| 亚洲国产精品va在线| 欧美视频在线免费看| 亚洲少妇中文在线| 国产精品第一视频| 日韩av免费在线看| 亚洲精品综合精品自拍| 欧美成年人视频| 欧美电影在线观看高清| 成人午夜小视频| 精品综合久久久久久97| 亚洲少妇激情视频| 欧美老肥婆性猛交视频| 日韩大陆欧美高清视频区| 中文字幕九色91在线| 亚洲国产精品电影在线观看| 亚洲精品久久久一区二区三区| 超在线视频97| 久久精品在线播放| 中文国产成人精品| 亚洲精品中文字幕女同| 中文字幕在线精品| 国产精品午夜国产小视频| 久久6免费高清热精品| 国产精品免费电影| 日韩国产欧美精品一区二区三区| 欧美片一区二区三区| 国产视频久久网| 一本一本久久a久久精品牛牛影视| 国产精品27p| 97视频在线观看网址| 国产伊人精品在线| 两个人的视频www国产精品| 亚洲福利在线观看| 亚洲福利小视频| 亚洲毛茸茸少妇高潮呻吟| 欧美性xxxx极品hd欧美风情| 日韩一区在线视频| 欧美视频在线免费看| 7777精品视频| 92版电视剧仙鹤神针在线观看| 久久久久久久久久久91| 欧美午夜久久久| 成人性生交大片免费观看嘿嘿视频| 欧美国产日韩中文字幕在线| 欧美高清videos高潮hd| 午夜伦理精品一区| 国产欧美 在线欧美| 亚洲欧洲偷拍精品| 日韩大陆毛片av| 欧美激情一区二区三级高清视频| 亚洲大胆人体av| 中文欧美日本在线资源| 国产精品欧美风情| 国产成人av在线播放| 综合激情国产一区| 91精品国产综合久久香蕉最新版| 久久精品成人欧美大片古装| 国产精品极品在线|