最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C 語(yǔ)言指針變量詳細(xì)介紹

 更新時(shí)間:2016年08月23日 10:28:47   投稿:lqh  
本文主要介紹C 語(yǔ)言指針變量,這里詳細(xì)介紹了 C語(yǔ)言中指針變量的用法,并附代碼示例及指針變量指向關(guān)系圖幫助大家理解指針,有學(xué)習(xí)C語(yǔ)言指針的朋友可以參考下

數(shù)據(jù)在內(nèi)存中的地址也稱為指針,如果一個(gè)變量存儲(chǔ)了一份數(shù)據(jù)的指針,我們就稱它為指針變量。

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

現(xiàn)在假設(shè)有一個(gè) char 類型的變量 c,它存儲(chǔ)了字符 'K'(ASCII碼為十進(jìn)制數(shù) 75),并占用了地址為 0X11A 的內(nèi)存(地址通常用十六進(jìn)制表示)。另外有一個(gè)指針變量 p,它的值為 0X11A,正好等于變量 c 的地址,這種情況我們就稱 p 指向了 c,或者說(shuō) p 是指向變量 c 的指針。

定義指針變量

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

datatype *name;

或者

datatype *name = value;

*表示這是一個(gè)指針變量,datatype表示該指針變量所指向的數(shù)據(jù)的類型 。例如:

int *p1;

p1 是一個(gè)指向 int 類型數(shù)據(jù)的指針變量,至于 p1 究竟指向哪一份數(shù)據(jù),應(yīng)該由賦予它的值決定。再如:

int a = 100;
int *p_a = &a;

在定義指針變量 p_a 的同時(shí)對(duì)它進(jìn)行初始化,并將變量 a 的地址賦予它,此時(shí) p_a 就指向了 a。值得注意的是,p_a 需要的一個(gè)地址,a 前面必須要加取地址符&,否則是不對(duì)的。

和普通變量一樣,指針變量也可以被多次寫(xiě)入,只要你想,隨時(shí)都能夠改變指針變量的值,請(qǐng)看下面的代碼:

//定義普通變量
float a = 99.5, b = 10.6;
char c = '@', d = '#';
//定義指針變量
float *p1 = &a;
char *p2 = &c;
//修改指針變量的值
p1 = &b;
p2 = &d;

*是一個(gè)特殊符號(hào),表明一個(gè)變量是指針變量,定義 p1、p2 時(shí)必須帶*。而給 p1、p2 賦值時(shí),因?yàn)橐呀?jīng)知道了它是一個(gè)指針變量,就沒(méi)必要多此一舉再帶上*,后邊可以像使用普通變量一樣來(lái)使用指針變量。也就是說(shuō),定義指針變量時(shí)必須帶*,給指針變量賦值時(shí)不能帶*。

假設(shè)變量 a、b、c、d 的地址分別為 0X1000、0X1004、0X2000、0X2004,下面的示意圖很好地反映了 p1、p2 指向的變化:

需要強(qiáng)調(diào)的是,p1、p2 的類型分別是float*和char*,而不是float和char,它們是完全不同的數(shù)據(jù)類型,讀者要引起注意。

指針變量也可以連續(xù)定義,例如:

int *a, *b, *c;  //a、b、c 的類型都是 int*

注意每個(gè)變量前面都要帶*。如果寫(xiě)成下面的形式,那么只有 a 是指針變量,b、c 都是類型為 int 的普通變量:

int *a, b, c;

通過(guò)指針變量取得數(shù)據(jù)

指針變量存儲(chǔ)了數(shù)據(jù)的地址,通過(guò)指針變量能夠獲得該地址上的數(shù)據(jù),格式為:

*pointer;

這里的*稱為指針運(yùn)算符,用來(lái)取得某個(gè)地址上的數(shù)據(jù),請(qǐng)看下面的例子:

#include <stdio.h>
int main(){
 int a = 15;
 int *p = &a;
 printf("%d, %d\n", a, *p); //兩種方式都可以輸出a的值
 return 0;
}

運(yùn)行結(jié)果:

15, 15

假設(shè) a 的地址是 0X1000,p 指向 a 后,p 本身的值也會(huì)變?yōu)?0X1000,*p 表示獲取地址 0X1000 上的數(shù)據(jù),也即變量 a 的值。從運(yùn)行結(jié)果看,*p 和 a 是等價(jià)的。

上節(jié)我們說(shuō)過(guò),CPU 讀寫(xiě)數(shù)據(jù)必須要知道數(shù)據(jù)在內(nèi)存中的地址,普通變量和指針變量都是地址的助記符,雖然通過(guò) *p 和 a 獲取到的數(shù)據(jù)一樣,但它們的運(yùn)行過(guò)程稍有不同:a 只需要一次運(yùn)算就能夠取得數(shù)據(jù),而 *p 要經(jīng)過(guò)兩次運(yùn)算,多了一層“間接”。

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

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

也就是說(shuō),使用指針是間接獲取數(shù)據(jù),使用變量名是直接獲取數(shù)據(jù),前者比后者的代價(jià)要高。

指針除了可以獲取內(nèi)存上的數(shù)據(jù),也可以修改內(nèi)存上的數(shù)據(jù),例如:

#include <stdio.h>
int main(){
 int a = 15, b = 99, c = 222;
 int *p = &a; //定義指針變量
 *p = b; //通過(guò)指針變量修改內(nèi)存上的數(shù)據(jù)
 c = *p; //通過(guò)指針變量獲取內(nèi)存上的數(shù)據(jù)
 printf("%d, %d, %d, %d\n", a, b, c, *p);
 return 0;
}

運(yùn)行結(jié)果:

99, 99, 99, 99

*p 代表的是 a 中的數(shù)據(jù),它等價(jià)于 a,可以將另外的一份數(shù)據(jù)賦值給它,也可以將它賦值給另外的一個(gè)變量。

*在不同的場(chǎng)景下有不同的作用:*可以用在指針變量的定義中,表明這是一個(gè)指針變量,以和普通變量區(qū)分開(kāi);使用指針變量時(shí)在前面加*表示獲取指針指向的數(shù)據(jù),或者說(shuō)表示的是指針指向的數(shù)據(jù)本身。

也就是說(shuō),定義指針變量時(shí)的*和使用指針變量時(shí)的*意義完全不同。以下面的語(yǔ)句為例:

int *p = &a;
*p = 100;

第1行代碼中*用來(lái)指明 p 是一個(gè)指針變量,第2行代碼中*用來(lái)獲取指針指向的數(shù)據(jù)。

需要注意的是,給指針變量本身賦值時(shí)不能加*。修改上面的語(yǔ)句:

int *p;
p = &a;
*p = 100;

第2行代碼中的 p 前面就不能加*。

指針變量也可以出現(xiàn)在普通變量能出現(xiàn)的任何表達(dá)式中,例如:

int x, y, *px = &x, *py = &y;
y = *px + 5; //表示把x的內(nèi)容加5并賦給y,*px+5相當(dāng)于(*px)+5
y = ++*px; //px的內(nèi)容加上1之后賦給y,++*px相當(dāng)于++(*px)
y = *px++; //相當(dāng)于y=(*px)++
py = px; //把一個(gè)指針的值賦給另一個(gè)指針

【示例】通過(guò)指針交換兩個(gè)變量的值。

#include <stdio.h>
int main(){
 int a = 100, b = 999, temp;
 int *pa = &a, *pb = &b;
 printf("a=%d, b=%d\n", a, b);
 /*****開(kāi)始交換*****/
 temp = *pa; //將a的值先保存起來(lái)
 *pa = *pb; //將b的值交給a
 *pb = temp; //再將保存起來(lái)的a的值交給b
 /*****結(jié)束交換*****/
 printf("a=%d, b=%d\n", a, b);
 return 0;
}

運(yùn)行結(jié)果:

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

從運(yùn)行結(jié)果可以看出,a、b 的值已經(jīng)發(fā)生了交換。需要注意的是臨時(shí)變量 temp,它的作用特別重要,因?yàn)閳?zhí)行*pa = *pb;語(yǔ)句后 a 的值會(huì)被 b 的值覆蓋,如果不先將 a 的值保存起來(lái)以后就找不到了。

關(guān)于 * 和 & 的謎題

假設(shè)有一個(gè) int 類型的變量 a,pa 是指向它的指針,那么*&a和&*pa分別是什么意思呢?

*&a可以理解為*(&a),&a表示取變量 a 的地址(等價(jià)于 pa),*(&a)表示取這個(gè)地址上的數(shù)據(jù)(等價(jià)于 *pa),繞來(lái)繞去,又回到了原點(diǎn),*&a仍然等價(jià)于 a。

&*pa可以理解為&(*pa),*pa表示取得 pa 指向的數(shù)據(jù)(等價(jià)于 a),&(*pa)表示數(shù)據(jù)的地址(等價(jià)于 &a),所以&*pa等價(jià)于 pa。

對(duì)星號(hào)*的總結(jié)

在我們目前所學(xué)到的語(yǔ)法中,星號(hào)*主要有三種用途:

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

以上就對(duì) C語(yǔ)言指針變量的資料整理,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++編譯期循環(huán)獲取變量類型詳情

    C++編譯期循環(huán)獲取變量類型詳情

    這篇文章主要介紹了C++編譯期循環(huán)獲取變量類型詳情,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,感興趣的小伙伴可以參考一下
    2022-09-09
  • C++實(shí)現(xiàn)LeetCode(7.翻轉(zhuǎn)整數(shù))

    C++實(shí)現(xiàn)LeetCode(7.翻轉(zhuǎn)整數(shù))

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(7.翻轉(zhuǎn)整數(shù)),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • VC++實(shí)現(xiàn)View內(nèi)容保存為圖片的方法

    VC++實(shí)現(xiàn)View內(nèi)容保存為圖片的方法

    這篇文章主要介紹了VC++實(shí)現(xiàn)View內(nèi)容保存為圖片的方法,涉及VC++中Bitmap類的save方法相關(guān)使用技巧,需要的朋友可以參考下
    2016-08-08
  • c++中cin實(shí)現(xiàn)輸入字符串方式

    c++中cin實(shí)現(xiàn)輸入字符串方式

    這篇文章主要介紹了c++中cin實(shí)現(xiàn)輸入字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++實(shí)現(xiàn)AVL樹(shù)的完整代碼

    C++實(shí)現(xiàn)AVL樹(shù)的完整代碼

    AVL樹(shù)是高度平衡的而二叉樹(shù)。它的特點(diǎn)是:AVL樹(shù)中任何節(jié)點(diǎn)的兩個(gè)子樹(shù)的高度最大差別為1。 今天通過(guò)本文給大家分享C++實(shí)現(xiàn)AVL樹(shù)的完整代碼,感興趣的朋友一起看看吧
    2021-06-06
  • 深入分析C++中執(zhí)行多個(gè)exe文件方法的批處理代碼介紹

    深入分析C++中執(zhí)行多個(gè)exe文件方法的批處理代碼介紹

    本篇文章是對(duì)C++中執(zhí)行多個(gè)exe文件方法的批處理代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++ boost scoped_ptr智能指針詳解

    C++ boost scoped_ptr智能指針詳解

    智能指針是一種像指針的C++對(duì)象,但它能夠在對(duì)象不使用的時(shí)候自己銷毀掉。雖然STL提供了auto_ptr,但是由于不能同容器一起使用(不支持拷貝和賦值操作),因此很少有人使用。它是Boost各組件中,應(yīng)用最為廣泛的一個(gè)
    2022-11-11
  • C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[二]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[二]

    C 語(yǔ)言基礎(chǔ)教程(我的C之旅開(kāi)始了)[二]...
    2007-02-02
  • C語(yǔ)言深入了解自定義數(shù)據(jù)類型的使用

    C語(yǔ)言深入了解自定義數(shù)據(jù)類型的使用

    這篇文章主要給大家介紹了關(guān)于C語(yǔ)言自定義數(shù)據(jù)類型的結(jié)構(gòu)體、枚舉和聯(lián)合的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • C++回溯算法中的全排列問(wèn)題分析探討

    C++回溯算法中的全排列問(wèn)題分析探討

    遞歸中遇到一個(gè)問(wèn)題全排列的問(wèn)題,我看見(jiàn)回溯特別神奇,特此記錄一下。對(duì)比一下深度優(yōu)先搜索與廣度優(yōu)先搜索,個(gè)人感覺(jué)這里的回溯像是一種遞歸樹(shù)中的深度優(yōu)先搜索的算法,他不斷構(gòu)造往下延伸的深度,使其達(dá)到完全編列
    2023-03-03

最新評(píng)論

金堂县| 城步| 玉门市| 肥西县| 察哈| 冷水江市| 张家界市| 鹰潭市| 建瓯市| 凌云县| 武定县| 沙河市| 平武县| 上栗县| 桐柏县| 邹平县| 吴川市| 宜春市| 女性| 剑川县| 和顺县| 株洲县| 巴彦淖尔市| 汨罗市| 子长县| 二手房| 全州县| 威海市| 都兰县| 观塘区| 咸宁市| 蓬安县| 闽侯县| 辛集市| 广宗县| 深州市| 麻阳| 筠连县| 永清县| 肇庆市| 白水县|