亚洲一级免费看,特黄特色大片免费观看播放器,777毛片,久久久久国产一区二区三区四区,欧美三级一区二区,国产精品一区二区久久久久,人人澡人人草

C語(yǔ)言

解析C語(yǔ)言編程中指針賦值的實(shí)例

時(shí)間:2025-03-22 01:34:59 C語(yǔ)言 我要投稿
  • 相關(guān)推薦

解析C語(yǔ)言編程中指針賦值的實(shí)例

  從const int i 說(shuō)起

  你知道我們聲明一個(gè)變量時(shí)象這樣int i ;這個(gè)i是可能在它處重新變賦值的。如下:

  int i = 0;/* . . . */i = 20; /*這里重新賦值了*/

  不過(guò)有一天我的程序可能需要這樣一個(gè)變量(暫且稱(chēng)它變量),在聲明時(shí)就賦一個(gè)初始值。之后我的程序在其它任何處都不會(huì)再去重新對(duì)它賦值。那我又應(yīng)該怎么辦呢?用const 。

  /* . . . */const int ic =20;/* . . . */ic = 40; /*這樣是不可以的,編譯時(shí)是無(wú)法通過(guò),因?yàn)槲覀儾荒軐?duì)const 修飾的ic重新賦值的。*//*這樣我們的程序就會(huì)更早更容易發(fā)現(xiàn)問(wèn)題了。*//* . . . */

  有了const修飾的ic 我們不稱(chēng)它為變量,而稱(chēng)符號(hào)常量,代表著20這個(gè)數(shù)。這就是const 的作用。ic是不能在它處重新賦新值了。

  認(rèn)識(shí)了const 作用之后,另外,我們還要知道格式的寫(xiě)法。有兩種:

  const int ic = 20;

  與

  int const ic = 20;

  它們是完全相同的。這一點(diǎn)我們是要清楚?傊,務(wù)必要記住const 與int哪個(gè)寫(xiě)前都不影響語(yǔ)義。有了這個(gè)概念后,我們來(lái)看這兩個(gè)家伙:

  const int *pi

  與

  int const *pi

  按普通的邏輯看,它們的語(yǔ)義有不同嗎?呵呵,只要記住一點(diǎn):int 與const 哪個(gè)放前哪個(gè)放后都是一樣的,就好比const int ic;與int const ic;一樣。也就是說(shuō),它們是相同的。

  好了,我們現(xiàn)在已經(jīng)搞定一個(gè)“雙包胎”的問(wèn)題。那么

  int *const pi;

  與前兩個(gè)語(yǔ)句又有什么不同呢?下面就來(lái)具體分析它們的格式與語(yǔ)義吧。

  先來(lái)說(shuō)說(shuō)const int *pi是什么作用 (當(dāng)然int const *pi也是一樣的,前面我們說(shuō)過(guò),它們實(shí)際是一樣的)?聪旅娴睦樱

  #include "stdio.h"main(){ /* 代碼開(kāi)始 */ int i1 = 30; int i2 = 40; /* 現(xiàn)在 pi 變量的內(nèi)容為 i1 的內(nèi)存地址 */ const int *pi = &i1; /* 注意這里,pi可以在任意時(shí)候重新賦值一個(gè)新內(nèi)存地址*/ /* pi 變量的內(nèi)容為 i2 的內(nèi)存地址 */ pi = &i2; /* 想想看:這里能用*pi = 80來(lái)代替嗎?當(dāng)然不能!*/ i2 = 80; printf("%dn", *pi); /* 輸出是80 */ /* 代碼結(jié)束 */}

  語(yǔ)義分析:

  看出來(lái)了沒(méi)有,pi的值是可以被修改的。即它可以重新指向另一個(gè)地址的,但是,不能通過(guò)*pi來(lái)修改i2的值。這個(gè)規(guī)則符合我們前面所講的邏輯嗎?當(dāng)然符合了。

  首先const 修飾的是整個(gè)*pi(注意,我寫(xiě)的是*pi而不是pi)。所以*pi是常量,是不能被賦值的(雖然pi所指的i2是變量,不是常量)。

  其次,pi前并沒(méi)有用const 修飾,所以pi是指針變量,能被賦值重新指向另一內(nèi)存地址的。你可能會(huì)疑問(wèn):那我又如何用const 來(lái)修飾pi呢?其實(shí),你注意到int *const pi中 const 的位置就大概可以明白了。請(qǐng)記住,通過(guò)格式看語(yǔ)義。哈哈,你可能已經(jīng)看出了規(guī)律吧?那下面的一節(jié)也就沒(méi)必要看下去了。不過(guò)我還得繼續(xù)我的戰(zhàn)斗。

  再看int *const pi

  確實(shí),int *const pi與前面的int const *pi會(huì)很容易給混淆的。注意:前面一句的const 是寫(xiě)在pi前和*號(hào)后的,而不是寫(xiě)在*pi前的。很顯然,它是修飾限定pi的。我先讓你看例子:

  #include "stdio.h"main(){ /* 代碼開(kāi)始 */ int i1 = 30; int i2 = 40; int *const pi = &i1; /* pi = &i2; 注意這里,pi不能再這樣重新賦值了,即不能再指向另一個(gè)新地址。*/ /* 所以我已經(jīng)注釋了它。*/ i1 = 80; /* 想想看:這里能用 *pi = 80; 來(lái)代替嗎?可以,這里可以通過(guò)*pi修改i1的值。(第5行的注釋?zhuān)?/ /* 請(qǐng)自行與前面一個(gè)例子比較。 */ printf("%d", *pi); /* 輸出是80 */ /* 代碼結(jié)束 */}

  語(yǔ)義分析:

  看了這段代碼,你明白了什么?有沒(méi)有發(fā)現(xiàn)pi值是不能重新賦值修改了。它只能永遠(yuǎn)指向初始化時(shí)的內(nèi)存地址了。相反,這次你可以通過(guò)*pi來(lái)修改i1的值了。與前一個(gè)例子對(duì)照一下吧,看以下的兩點(diǎn)分析:

  pi因?yàn)橛辛薱onst 的修飾,所以只是一個(gè)指針常量:也就是說(shuō)pi值是不可修改的(即pi不可以重新指向i2這個(gè)變量了)(請(qǐng)看第4行的注釋?zhuān)?/p>

  整個(gè)*pi的前面沒(méi)有const 的修飾。也就是說(shuō),*pi是變量而不是常量,所以我們可以通過(guò)*pi來(lái)修改它所指內(nèi)存i1的值(請(qǐng)看第5行的注釋?zhuān)?/p>

  總之一句話(huà),這次的pi是一個(gè)指向int變量類(lèi)型數(shù)據(jù)的指針常量。

  我最后總結(jié)兩句:

  如果const 修飾在*pi前,則不能改的是*pi(即不能類(lèi)似這樣:*pi=50;賦值)而不是指pi。

  如果const 是直接寫(xiě)在pi前,則pi不能改(即不能類(lèi)似這樣:pi=&i;賦值)。

  請(qǐng)你務(wù)必先記住這兩點(diǎn),相信你一定不會(huì)再被它們給搞糊了,F(xiàn)在再看這兩個(gè)聲明語(yǔ)句int const *pi和int *const pi時(shí),呵呵,你會(huì)頭昏腦脹還是很輕松愜意?它們各自聲明的pi分別能修改什么,不能修改什么?再思考下這些問(wèn)題。

  補(bǔ)充三種情況

  這里,我再補(bǔ)充以下三種情況。其實(shí)只要上面的語(yǔ)義搞清楚了,這三種情況也就已經(jīng)被包含了。不過(guò)作為三種具體的形式,我還是簡(jiǎn)單提一下吧。

  情況一:int *pi指針指向const int i常量的情況

  #include "stdio.h"main(){ /* begin */ const int i1 = 40; int *pi; pi = &i1; /* 這樣可以嗎?不行,VC下是編譯錯(cuò)。*/ /* const int 類(lèi)型的i1的地址是不能賦值給指向int 類(lèi)型地址的指針pi的。否則pi豈不是能修改i1的值了嗎!*/ pi = (int *) &i1; /* 這樣可以嗎?強(qiáng)制類(lèi)型轉(zhuǎn)換可是C所支持的。*/ /* VC下編譯通過(guò),但是仍不能通過(guò) *pi = 80來(lái)修改i1的值。去試試吧!看看具體的怎樣。*/ /* end */}

  情況二:const int *pi指針指向const int i1的情況

  #include "stdio.h"main(){ /* begin */ const int i1=40; const int * pi; pi=&i1;/* 兩個(gè)類(lèi)型相同,可以這樣賦值。很顯然,i1的值無(wú)論是通過(guò)pi還是i1都不能修改的。 */ /* end */}

  情況三:用const int *const pi聲明的指針

  #include "stdio.h"main(){ /* begin */ int i; const int * const pi=&i; /*你能想象pi能夠作什么操作嗎?pi值不能改,也不能通過(guò)pi修改i的值。因?yàn)椴还苁?pi還是pi都是const的。 */ /* end */}

  

【解析C語(yǔ)言編程中指針賦值的實(shí)例】相關(guān)文章:

C語(yǔ)言的指針類(lèi)型解析03-20

Swift與C語(yǔ)言指針結(jié)合使用實(shí)例12-28

C語(yǔ)言數(shù)組實(shí)例解析02-21

C語(yǔ)言中野指針的深入解析08-06

C語(yǔ)言親密數(shù)實(shí)例解析04-06

C語(yǔ)言的指針12-21

c語(yǔ)言指針中的二級(jí)指針示例詳解03-02

C語(yǔ)言結(jié)構(gòu)體中的函數(shù)指針06-14

在Swift中怎么使用C語(yǔ)言的指針08-07