那曲檬骨新材料有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

const 和指針變量使用

科技綠洲 ? 來源:C語言中文網(wǎng) ? 作者:C語言中文網(wǎng) ? 2023-06-22 10:43 ? 次閱讀

有時(shí)候我們希望定義這樣一種變量,它的值不能被改變,在整個(gè)作用域中都保持固定。例如,用一個(gè)變量來表示班級(jí)的最大人數(shù),或者表示緩沖區(qū)的大小。為了滿足這一要求,可以使用const關(guān)鍵字對(duì)變量加以限定:

const int MaxNum = 100;  //班級(jí)的最大人數(shù)

這樣 MaxNum 的值就不能被修改了,任何對(duì) MaxNum 賦值的行為都將引發(fā)錯(cuò)誤:

MaxNum = 90;  //錯(cuò)誤,試圖向 const 變量寫入數(shù)據(jù)

我們經(jīng)常將 const 變量稱為常量(Constant)。創(chuàng)建常量的格式通常為:

const type name = value;

const 和 type 都是用來修飾變量的,它們的位置可以互換,也就是將 type 放在 const 前面:

type const name = value;

但我們通常采用第一種方式,不采用第二種方式。另外建議將常量名的首字母大寫,以提醒程序員這是個(gè)常量。

由于常量一旦被創(chuàng)建后其值就不能再改變,所以常量必須在定義的同時(shí)賦值(初始化),后面的任何賦值行為都將引發(fā)錯(cuò)誤。一如既往,初始化常量可以使用任意形式的表達(dá)式,如下所示:

#include int getNum(){    return 100;}int main(){    int n = 90;    const int MaxNum1 = getNum();  //運(yùn)行時(shí)初始化    const int MaxNum2 = n;  //運(yùn)行時(shí)初始化    const int MaxNum3 = 80;  //編譯時(shí)初始化    printf("%d, %d, %d\\n", MaxNum1, MaxNum2, MaxNum3);    return 0;}

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

100, 90, 80

一、const 和指針

const 也可以和指針變量一起使用,這樣可以限制指針變量本身,也可以限制指針指向的數(shù)據(jù)。const 和指針一起使用會(huì)有幾種不同的順序,如下所示:

const int *p1;int const *p2;int * const p3;

在最后一種情況下,指針是只讀的,也就是 p3 本身的值不能被修改;在前面兩種情況下,指針?biāo)赶虻臄?shù)據(jù)是只讀的,也就是 p1、p2 本身的值可以修改(指向不同的數(shù)據(jù)),但它們指向的數(shù)據(jù)不能被修改。

當(dāng)然,指針本身和它指向的數(shù)據(jù)都有可能是只讀的,下面的兩種寫法能夠做到這一點(diǎn):

const int * const p4;int const * const p5;

const 和指針結(jié)合的寫法多少有點(diǎn)讓初學(xué)者摸不著頭腦,大家可以這樣來記憶:const 離變量名近就是用來修飾指針變量的,離變量名遠(yuǎn)就是用來修飾指針指向的數(shù)據(jù),如果近的和遠(yuǎn)的都有,那么就同時(shí)修飾指針變量以及它指向的數(shù)據(jù)。

二、const 和函數(shù)形參

C語言中,單獨(dú)定義 const 變量沒有明顯的優(yōu)勢(shì),完全可以使用#define命令代替。const 通常用在函數(shù)形參中,如果形參是一個(gè)指針,為了防止在函數(shù)內(nèi)部修改指針指向的數(shù)據(jù),就可以用 const 來限制。

在C語言標(biāo)準(zhǔn)庫中,有很多函數(shù)的形參都被 const 限制了,下面是部分函數(shù)的原型:

size_t strlen ( const char * str );int strcmp ( const char * str1, const char * str2 );char * strcat ( char * destination, const char * source );char * strcpy ( char * destination, const char * source );int system (const char* command);int puts ( const char * str );int printf ( const char * format, ... );

我們自己在定義函數(shù)時(shí)也可以使用 const 對(duì)形參加以限制,例如查找字符串中某個(gè)字符出現(xiàn)的次數(shù):

#include size_t strnchr(const char *str, char ch){    int i, n = 0, len = strlen(str);    for(i=0; i;>        if(str[i] == ch){            n++;        }    }
return n;}int main(){ char *str = "http://c.biancheng.net"; char ch = 't'; int n = strnchr(str, ch); printf("%d\\n", n); return 0;}

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

3

根據(jù) strnchr() 的功能可以推斷,函數(shù)內(nèi)部要對(duì)字符串 str 進(jìn)行遍歷,不應(yīng)該有修改的動(dòng)作,用 const 加以限制,不但可以防止由于程序員誤操作引起的字符串修改,還可以給用戶一個(gè)提示,函數(shù)不會(huì)修改你提供的字符串,請(qǐng)你放心。

三、const 和非 const 類型轉(zhuǎn)換

當(dāng)一個(gè)指針變量 str1 被 const 限制時(shí),并且類似const char *str1這種形式,說明指針指向的數(shù)據(jù)不能被修改;如果將 str1 賦值給另外一個(gè)未被 const 修飾的指針變量 str2,就有可能發(fā)生危險(xiǎn)。因?yàn)橥ㄟ^ str1 不能修改數(shù)據(jù),而賦值后通過 str2 能夠修改數(shù)據(jù)了,意義發(fā)生了轉(zhuǎn)變,所以編譯器不提倡這種行為,會(huì)給出錯(cuò)誤或警告。

也就是說,const char *和char *是不同的類型,不能將const char *類型的數(shù)據(jù)賦值給char *類型的變量。但反過來是可以的,編譯器允許將char *類型的數(shù)據(jù)賦值給const char *類型的變量。

這種限制很容易理解,char *指向的數(shù)據(jù)有讀取和寫入權(quán)限,而const char *指向的數(shù)據(jù)只有讀取權(quán)限,降低數(shù)據(jù)的權(quán)限不會(huì)帶來任何問題,但提升數(shù)據(jù)的權(quán)限就有可能發(fā)生危險(xiǎn)。

C語言標(biāo)準(zhǔn)庫中很多函數(shù)的參數(shù)都被 const 限制了,但我們?cè)谝郧暗木幋a過程中并沒有注意這個(gè)問題,經(jīng)常將非 const 類型的數(shù)據(jù)傳遞給 const 類型的形參,這樣做從未引發(fā)任何副作用,原因就是上面講到的,將非 const 類型轉(zhuǎn)換為 const 類型是允許的。

下面是一個(gè)將 const 類型賦值給非 const 類型的例子:

#include 
void func(char *str){ }
int main(){ const char *str1 = "c.biancheng.net"; char *str2 = str1; func(str1); return 0;}

第7、8行代碼分別通過賦值、傳參(傳參的本質(zhì)也是賦值)將 const 類型的數(shù)據(jù)交給了非 const 類型的變量,編譯器不會(huì)容忍這種行為,會(huì)給出警告,甚至直接報(bào)錯(cuò)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7139

    瀏覽量

    89576
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4346

    瀏覽量

    62971
  • CONST
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    8187
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    指針變量的基本操作

    指針變量也是一個(gè)變量,對(duì)應(yīng)一塊內(nèi)存空間,對(duì)應(yīng)一個(gè)內(nèi)存地址,指針名就是己址。這空內(nèi)存空間多大?一個(gè)機(jī)器字長(zhǎng)(machine word),32位的CPU和操作系統(tǒng)就是32個(gè)位,4個(gè)字節(jié),其
    發(fā)表于 10-26 09:56 ?445次閱讀

    指針變量const問題

    請(qǐng)問指針變量作函數(shù)的形參(*SENTENCE),void wrlcd(u8 HANG,u8 LIE,u8 *SENTENCE)// 行、列、數(shù)據(jù){u8 position;position
    發(fā)表于 12-15 10:30

    const 指針探討

    在筆試中經(jīng)常會(huì)經(jīng)常會(huì)考到const來修飾指針的考法。今天和大家探討下。const 常量,可讀(不可改變)const char *pchar cons
    發(fā)表于 08-06 15:33

    指針變量, 位帶指針 ,LSB最低有效位 ······

    指針變量,位帶指針,LSB最低有效位······
    的頭像 發(fā)表于 03-08 11:53 ?2557次閱讀

    從STM32到CONST的全局變量

    ? ?STM32的const全局變量地址 程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int
    的頭像 發(fā)表于 07-23 10:50 ?4944次閱讀

    C++中const以及this指針的使用

    const 作用 修飾變量,說明該變量不可以被改變; 修飾指針,分為指向常量的指針(pointer to
    的頭像 發(fā)表于 09-23 11:39 ?2064次閱讀

    STM32位帶引申的指針變量問題

    位帶操作牽涉到的一個(gè)重要知識(shí)點(diǎn)就是指針變量。這種位帶映射操作,就是操作映射過后的地址,其實(shí)就是操作指針變量(存放地址的變量)。
    發(fā)表于 02-08 15:57 ?3次下載
    STM32位帶引申的<b class='flag-5'>指針</b><b class='flag-5'>變量</b>問題

    怎樣去使用C語言中的const關(guān)鍵字呢

    我們會(huì)發(fā)現(xiàn)兩者的區(qū)別const一個(gè)注釋的全局變量一個(gè)注釋的局部變量,我們編譯都能通過,不過使用全部變量的程序運(yùn)行會(huì)報(bào)段錯(cuò)誤,而局部變量的能夠
    的頭像 發(fā)表于 08-12 09:13 ?1495次閱讀
    怎樣去使用C語言中的<b class='flag-5'>const</b>關(guān)鍵字呢

    單片機(jī)指針變量及例子

    這種位帶映射操作,就是操作映射過后的地址,其實(shí)就是操作指針變量(存放地址的變量)。 指針變量是一種特殊的
    發(fā)表于 12-29 13:52 ?767次閱讀

    同樣是const,為什么結(jié)果不一樣?

    C語言中,const修飾的是只讀變量,意思是不能通過變量本身去修改對(duì)應(yīng)內(nèi)存的值,但是可以通過其他方式去修改,比如指針。代碼中確實(shí)也是通過指針
    的頭像 發(fā)表于 02-02 16:03 ?942次閱讀

    指針能不能作為循環(huán)變量

    指針能不能作為循環(huán)變量
    的頭像 發(fā)表于 02-16 18:11 ?1081次閱讀

    圖解C語言指針變量

    指針變量也是一個(gè)變量,對(duì)應(yīng)一塊內(nèi)存空間,對(duì)應(yīng)一個(gè)內(nèi)存地址,指針名就是己址。這空內(nèi)存空間多大?一個(gè)機(jī)器字長(zhǎng)(machine word),32位的CPU和操作系統(tǒng)就是32個(gè)位,4個(gè)字節(jié),其
    的頭像 發(fā)表于 05-04 10:15 ?773次閱讀
    圖解C語言<b class='flag-5'>指針</b><b class='flag-5'>變量</b>

    單片機(jī)位帶牽涉的指針變量問題

    單片機(jī)位帶牽涉的指針變量問題
    的頭像 發(fā)表于 09-27 15:18 ?511次閱讀
    單片機(jī)位帶牽涉的<b class='flag-5'>指針</b><b class='flag-5'>變量</b>問題

    const聲明的變量一定只能讀嗎?

    一直以為 const 聲明的變量一定是只讀的,并且也一定會(huì)存放在 FLASH 中,直到在 103 的 map 文件中看到了這個(gè)變量
    的頭像 發(fā)表于 10-07 09:23 ?707次閱讀
    <b class='flag-5'>const</b>聲明的<b class='flag-5'>變量</b>一定只能讀嗎?

    const 聲明的變量不一定是只讀的?

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個(gè)數(shù)組放在了 RAM 區(qū)(全局變量)。這意味著,這個(gè)變量仍可寫(通過指針
    發(fā)表于 10-19 10:05 ?443次閱讀
    <b class='flag-5'>const</b> 聲明的<b class='flag-5'>變量</b>不一定是只讀的?
    太阳城百家乐官网群| 百家乐娱乐平台真钱游戏| 凯旋门百家乐技巧| 海威百家乐赌博机| 明溪百家乐的玩法技巧和规则| 水浒传老虎机破解| 博王国际娱乐| 百家乐官网网站那个好| 百家乐官网扑克筹码| 百家乐官网麻将筹码币镭射贴膜| 百家乐大小桌布| 百家乐五铺的缆是什么意思| 雁荡棋牌游戏| 电子百家乐官网博彩正网| 百家乐官网筹码桌布| 罗盘24山八卦| 百家乐规律打| 皇冠网上投注站| 百家乐官网怎么骗人| 百家乐平注法技巧| 威尼斯人娱乐备用622| 皇冠最新投注网| 百家乐官网赌钱| 澳门百家乐娱乐注册| 大发888娱乐城网址| 百家乐官网补牌规制| 网上百家乐官网游戏哪家信誉度最好| 百家乐筹码桌| 娱乐城开户彩金| 百家乐官网公式书| 真人百家乐怎么对冲| 大发888娱乐城客户端lm0| 百家乐官网没有必胜| 百家乐官网策略介绍| 威尼斯人娱乐场it| 百家乐官网如何视频| 百家乐案件讯问| 大发888-娱乐网| 足球百家乐官网投注| 希尔顿百家乐试玩| ea平台|