C語言的靈魂——指針

一征懈、指針簡(jiǎn)介

1、什么是指針揩悄?

指針是一個(gè)變量卖哎,其值為另一個(gè)變量的地址,即內(nèi)存地址的直接地址删性。做個(gè)比喻亏娜,假設(shè)將你比作變量,那么你身份證上的住址就是指針蹬挺,根據(jù)你身份證上的地址可以找到你维贺,即指針存的內(nèi)容是你身份證上的住址。

指針有兩種含義巴帮,一是作為數(shù)據(jù)類型溯泣,二是作為實(shí)體。

指針作為實(shí)體榕茧,是一個(gè)用來保存一個(gè)內(nèi)存地址的計(jì)算機(jī)語言中的變量垃沦。指針一般出現(xiàn)在比較底層的程序設(shè)計(jì)語言中,如C語言用押。高級(jí)語言如Java一般避免用指針肢簿,而是引用。指針作為數(shù)據(jù)類型只恨,可以從一個(gè)函數(shù)類型译仗、一個(gè)對(duì)象類型或者一個(gè)不完備類型中導(dǎo)出。從中導(dǎo)出的數(shù)據(jù)類型稱之為被引用類型(referenced type)官觅。指針類型描述了一種對(duì)象纵菌,其值為對(duì)被引用類型的實(shí)體的引用。

指針可以用來有效地表示復(fù)雜的數(shù)據(jù)結(jié)構(gòu),可以用于函數(shù)參數(shù)傳遞并達(dá)到更加靈活使用函數(shù)的目的休涤。使C語言程序的設(shè)計(jì)具有靈活咱圆、實(shí)用笛辟、高效的特點(diǎn)。

2序苏、*與&操作符

取地址運(yùn)算符(&):取變量的地址手幢,即返回操作數(shù)的內(nèi)存地址。&var 讀作"var 的地址"忱详。

間接尋址運(yùn)算符(*):返回操作數(shù)所指定地址的變量的值围来。

3、如何使用指針匈睁?

使用指針時(shí)會(huì)頻繁進(jìn)行以下幾個(gè)操作:

  1. 定義一個(gè)指針變量监透;
  2. 把變量地址賦值給指針;
  3. 訪問指針變量中可用地址的值航唆。

這些是通過使用一元運(yùn)算符 * 來返回位于操作數(shù)所指定地址的變量的值胀蛮。

#include <stdio.h>
int main (){
   int  var = 20;   /* 實(shí)際變量的聲明 */
   int  *ip;/* 指針變量的聲明 */
   ip = &var;  /* 在指針變量中存儲(chǔ) var 的地址 */
   printf("Address of var variable: %x\n", &var  );
   /* 在指針變量中存儲(chǔ)的地址 */
   printf("Address stored in ip variable: %x\n", ip );
   /* 使用指針訪問值 */
   printf("Value of *ip variable: %d\n", *ip );
   return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

Address of var variable: bffd8b3c
Address stored in ip variable: bffd8b3c
Value of *ip variable: 20

4糯钙、指針運(yùn)算符

C 指針是一個(gè)用數(shù)值表示的地址粪狼。因此,您可以對(duì)指針執(zhí)行算術(shù)運(yùn)算任岸≡匍可以對(duì)指針進(jìn)行四種算術(shù)運(yùn)算:++、--演闭、+不跟、-。

假設(shè) ptr 是一個(gè)指向地址 1000 的整型指針米碰,是一個(gè) 32 位的整數(shù)窝革,讓我們對(duì)該指針執(zhí)行下列的算術(shù)運(yùn)算:

ptr++

在執(zhí)行完上述的運(yùn)算之后,ptr 將指向位置 1004吕座,因?yàn)?ptr 每增加一次虐译,它都將指向下一個(gè)整數(shù)位置,即當(dāng)前位置往后移 4 個(gè)字節(jié)吴趴。這個(gè)運(yùn)算會(huì)在不影響內(nèi)存位置中實(shí)際值的情況下漆诽,移動(dòng)指針到下一個(gè)內(nèi)存位置。如果 ptr 指向一個(gè)地址為 1000 的字符锣枝,上面的運(yùn)算會(huì)導(dǎo)致指針指向位置 1001厢拭,因?yàn)橄乱粋€(gè)字符位置是在 1001。

5撇叁、NULL 指針

在變量聲明的時(shí)候供鸠,如果沒有確切的地址可以賦值,為指針變量賦一個(gè) NULL 值是一個(gè)良好的編程習(xí)慣陨闹。賦為 NULL 值的指針被稱為空指針楞捂。NULL 指針是一個(gè)定義在標(biāo)準(zhǔn)庫中的值為零的常量薄坏。請(qǐng)看下面的程序:
#include <stdio.h>
int main (){
int *ptr = NULL;
printf("ptr 的值是 %x\n", ptr );
return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時(shí),它會(huì)產(chǎn)生下列結(jié)果:

ptr 的值是 0

二寨闹、指針與數(shù)組

1胶坠、區(qū)別

C++/C程序中,指針和數(shù)組在不少地方可以相互替換著用繁堡,讓人產(chǎn)生一種錯(cuò)覺沈善,以為兩者是等價(jià)的。數(shù)組是連續(xù)分配一串單元椭蹄,數(shù)目開始定義的時(shí)候就必須固定下來矮瘟,看起來整潔,但是寫的程序是死程序塑娇,容易浪費(fèi)內(nèi)存。指針是存放一個(gè)地址值劫侧,表示指向某一個(gè)單元埋酬,可以用指針來索引單元。數(shù)組可以完成棧烧栋,堆写妥,樹等等的操作,它在編程時(shí)候的好處是非常的靈活审姓,在構(gòu)建思路的時(shí)候有很大的靈活性珍特。

2、指針數(shù)組與數(shù)組指針

指針數(shù)組:array of pointers魔吐,即用于存儲(chǔ)指針的數(shù)組扎筒,也就是數(shù)組元素都是指針。

數(shù)組指針:a pointer to an array酬姆,數(shù)組名本身就是一個(gè)指針嗜桌,指向數(shù)組的首地址,即指向數(shù)組的指針辞色。

int* a[4] 骨宠;   /* 指針數(shù)組      
                 表示:數(shù)組a中的元素都為int型指針     
                 元素表示:*a[i]   *(a[i])是一樣的,因?yàn)閇]優(yōu)先級(jí)高于*/
int (*a)[4]  相满;/* 數(shù)組指針      
                 表示:指向數(shù)組a的指針
                 元素表示:(*a)[i]   */

#include <stdio.h>
int main(void)
{
    int c[4]={1,2,3,4};
    int *a[4]; //指針數(shù)組
    int (*b)[4]; //數(shù)組指針
    b=&c;
    //將數(shù)組c中元素賦給數(shù)組a
    for(int i=0;i<4;i++)
    {
        a[i]=&c[i];
    }
    //輸出看下結(jié)果
    printf("%d",*a[1]);//輸出2就對(duì)
    printf("%d",(*b)[2]);//輸出3就對(duì)
    return 0;
}

三层亿、指針與字符串

C語言中沒有特定的字符串類型,我們通常是將字符串放在一個(gè)字符數(shù)組中立美。字符數(shù)組歸根結(jié)底還是一個(gè)數(shù)組匿又,使用指針的方式來輸出字符串:

#include <stdio.h>
int main(){
    char str[] = "http://www.reibang.com/";
    char *pstr = str;
    int len = strlen(str), i;
    //使用*(pstr+i)
    for(i=0; i<len; i++){
        printf("%c", *(pstr+i));
    }
    printf("\n");
    //使用pstr[i]
    for(i=0; i<len; i++){
        printf("%c", pstr[i]);
    }
    printf("\n");
    //使用*(str+i)
    for(i=0; i<len; i++){
        printf("%c", *(str+i));
    }
    printf("\n");
    return 0;
}

四、指針與函數(shù)

函數(shù)指針:本身是一個(gè)指針悯辙,指向一個(gè)函數(shù)入口地址琳省,通過該指針可調(diào)用其指向的函數(shù)迎吵,使用函數(shù)指針可實(shí)現(xiàn)回調(diào)函數(shù)。

#include <stdio.h>
void inc(int *val)
{
    (*val)++;
}
int main(void)
{
    void (*fun)(int *);
    int a=3;
    fun=inc;//fun是一個(gè)函數(shù)指針
    (*fun)(&a);
    printf("%d" , a);
}

指針函數(shù):本身是一個(gè)函數(shù)针贬,其返回值是一個(gè)指針击费。

#include <stdio.h>
float *find(float(*pionter)[4],int n);//函數(shù)聲明
int main(void)
{
     static float score[][4]={{60,70,80,90},{56,89,34,45},{34,23,56,45}};
     float *p;
     int i,m;
     printf("Enter the number to be found:");
     scanf("%d",&m);
     printf("the score of NO.%d are:\n",m);
     p=find(score,m-1);
     for(i=0;i<4;i++)
         printf("%5.2f\t",*(p+i));
     return 0;
 }
float *find(float(*pionter)[4],int n)/*定義指針函數(shù)*/
 {
     float *pt;
     pt=*(pionter+n);
     return(pt);
 }

五、指針與引用

  1. 引用總是指向一個(gè)對(duì)象,沒有所謂的 null reference 桦他。所有當(dāng)有可能指向一個(gè)對(duì)象也有可能不指向?qū)ο髣t必須使用指針蔫巩。由于C++ 要求 reference 總是指向一個(gè)對(duì)象所以 reference要求有初值.由于沒有所謂的 null reference 所以在使用前不需要進(jìn)行測(cè)試其是否有值,而使用指針則需要測(cè)試其的有效性快压。
  2. 指針可以被重新賦值而reference則總是指向最初或地的對(duì)象圆仔。
  3. 必須使用reference的場(chǎng)合.Operator[]操作符由于該操作符很特別地必須返回 [能夠被當(dāng)做ssignment 賦值對(duì)象] 的東西,所以需要給他返回一個(gè) reference。
  4. 其實(shí)引用在函數(shù)的參數(shù)中使用很經(jīng)常蔫劣。格式如下:
    void Get***(const int& a){} //這樣使用了引用又可以保證不修改被引用的值

區(qū)別:

  • 指針是一個(gè)實(shí)體指向一塊內(nèi)存坪郭,它的內(nèi)容是所指內(nèi)存的地址;引用是某塊內(nèi)存的別名脉幢;
  • 引用使用時(shí)無需解引用(*)歪沃,指針需要解引用;
  • 引用只能在定義時(shí)被初始化一次嫌松,之后不可變沪曙;指針可變;
  • 引用“從一而終”萎羔;
  • 引用沒有 const液走,指針有 const,const 的指針不可變贾陷;
  • 引用不能為空缘眶,指針可以為空;
  • sizeof 引用”得到的是所指向的變量(對(duì)象)的大小髓废,而“sizeof 指針”得到的是指針本身(所指向的變量或?qū)ο蟮牡刂?的大邪跽浮;typeid(T) == typeid(T&) 恒為真瓦哎,sizeof(T) == sizeof(T&) 恒為真砸喻,但是當(dāng)引用作為成員時(shí),其占用空間與指針相同(沒找到標(biāo)準(zhǔn)的規(guī)定)蒋譬;
  • 指針和引用的自增(++)運(yùn)算意義不一樣割岛。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市犯助,隨后出現(xiàn)的幾起案子癣漆,更是在濱河造成了極大的恐慌,老刑警劉巖剂买,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件惠爽,死亡現(xiàn)場(chǎng)離奇詭異癌蓖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)婚肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門租副,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人较性,你說我怎么就攤上這事用僧。” “怎么了赞咙?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵责循,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我攀操,道長(zhǎng)院仿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任速和,我火速辦了婚禮意蛀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘健芭。我一直安慰自己,他們只是感情好秀姐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布慈迈。 她就那樣靜靜地躺著,像睡著了一般省有。 火紅的嫁衣襯著肌膚如雪痒留。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天蠢沿,我揣著相機(jī)與錄音伸头,去河邊找鬼。 笑死舷蟀,一個(gè)胖子當(dāng)著我的面吹牛恤磷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播野宜,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼扫步,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了匈子?” 一聲冷哼從身側(cè)響起河胎,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎虎敦,沒想到半個(gè)月后游岳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體政敢,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年胚迫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了喷户。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晌区,死狀恐怖摩骨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情朗若,我是刑警寧澤恼五,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站哭懈,受9級(jí)特大地震影響灾馒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜遣总,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一睬罗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旭斥,春花似錦容达、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至菇爪,卻和暖如春算芯,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背凳宙。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國打工熙揍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氏涩。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓届囚,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國和親是尖。 傳聞我的和親對(duì)象是個(gè)殘疾皇子奖亚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 指針是C語言中廣泛使用的一種數(shù)據(jù)類型。 運(yùn)用指針編程是C語言最主要的風(fēng)格之一析砸。利用指針變量可以表示各種數(shù)據(jù)結(jié)構(gòu)昔字; ...
    朱森閱讀 3,430評(píng)論 3 44
  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy閱讀 9,511評(píng)論 1 51
  • 1.語言中變量的實(shí)質(zhì) 要理解C指針,我認(rèn)為一定要理解C中“變量”的存儲(chǔ)實(shí)質(zhì), 所以我就從“變量”這個(gè)東西開始講起吧...
    金巴多閱讀 1,739評(píng)論 0 9
  • 鮮花伴我行作郭, 一路好春景陨囊。 人間四月天, 勝似在仙境夹攒。 --2017.4.14
    孫德娟欣欣兒閱讀 196評(píng)論 0 0
  • 剛下班蜘醋,腦袋嗡嗡作響,耳朵里就像有一群知了在里面知知的叫咏尝,嗡嗡嗡嗡压语,知知知知,好不討厭编检。我知道這是神經(jīng)性耳鳴胎食,大概...
    鶯歌學(xué)飛閱讀 191評(píng)論 0 0