欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

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

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

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

const 和指針變量使用

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

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

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

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

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

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

const type name = value;

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

type const name = value;

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

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

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

運行結(jié)果:

100, 90, 80

一、const 和指針

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

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

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

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

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

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

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

C語言中,單獨定義 const 變量沒有明顯的優(yōu)勢,完全可以使用#define命令代替。const 通常用在函數(shù)形參中,如果形參是一個指針,為了防止在函數(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ù)時也可以使用 const 對形參加以限制,例如查找字符串中某個字符出現(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;}

運行結(jié)果:

3

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

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

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

也就是說,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)限不會帶來任何問題,但提升數(shù)據(jù)的權(quán)限就有可能發(fā)生危險。

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

下面是一個將 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 類型的變量,編譯器不會容忍這種行為,會給出警告,甚至直接報錯。

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

    關(guān)注

    8

    文章

    7167

    瀏覽量

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

    關(guān)注

    3

    文章

    4346

    瀏覽量

    63012
  • CONST
    +關(guān)注

    關(guān)注

    0

    文章

    45

    瀏覽量

    8193
收藏 人收藏

    評論

    相關(guān)推薦

    指針變量的基本操作

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

    指針變量const問題

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

    const 指針探討

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

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

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

    從STM32到CONST的全局變量

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

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

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

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

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

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

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

    單片機指針變量及例子

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

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

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

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

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

    圖解C語言指針變量

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

    單片機位帶牽涉的指針變量問題

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

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

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

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

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數(shù)組放在了 RAM 區(qū)(全局變量)。這意味著,這個變量仍可寫(通過指針
    發(fā)表于 10-19 10:05 ?447次閱讀
    <b class='flag-5'>const</b> 聲明的<b class='flag-5'>變量</b>不一定是只讀的?