在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

const 和指針變量使用

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

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

const int MaxNum = 100;  //班級的最大人數

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

MaxNum = 90;  //錯誤,試圖向 const 變量寫入數據

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

const type name = value;

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

type const name = value;

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

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

#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;}

運行結果:

100, 90, 80

一、const 和指針

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

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

在最后一種情況下,指針是只讀的,也就是 p3 本身的值不能被修改;在前面兩種情況下,指針所指向的數據是只讀的,也就是 p1、p2 本身的值可以修改(指向不同的數據),但它們指向的數據不能被修改。

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

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

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

二、const 和函數形參

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

在C語言標準庫中,有很多函數的形參都被 const 限制了,下面是部分函數的原型:

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, ... );

我們自己在定義函數時也可以使用 const 對形參加以限制,例如查找字符串中某個字符出現的次數:

#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;}

運行結果:

3

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

三、const 和非 const 類型轉換

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

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

這種限制很容易理解,char *指向的數據有讀取和寫入權限,而const char *指向的數據只有讀取權限,降低數據的權限不會帶來任何問題,但提升數據的權限就有可能發生危險。

C語言標準庫中很多函數的參數都被 const 限制了,但我們在以前的編碼過程中并沒有注意這個問題,經常將非 const 類型的數據傳遞給 const 類型的形參,這樣做從未引發任何副作用,原因就是上面講到的,將非 const 類型轉換為 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行代碼分別通過賦值、傳參(傳參的本質也是賦值)將 const 類型的數據交給了非 const 類型的變量,編譯器不會容忍這種行為,會給出警告,甚至直接報錯。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 數據
    +關注

    關注

    8

    文章

    7149

    瀏覽量

    89604
  • 函數
    +關注

    關注

    3

    文章

    4346

    瀏覽量

    62983
  • CONST
    +關注

    關注

    0

    文章

    45

    瀏覽量

    8190
收藏 人收藏

    評論

    相關推薦

    指針變量的基本操作

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

    指針變量const問題

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

    const 指針探討

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

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

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

    從STM32到CONST的全局變量

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

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

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

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

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

    怎樣去使用C語言中的const關鍵字呢

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

    單片機指針變量及例子

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

    同樣是const,為什么結果不一樣?

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

    指針能不能作為循環變量

    指針能不能作為循環變量
    的頭像 發表于 02-16 18:11 ?1084次閱讀

    圖解C語言指針變量

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

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

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

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

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

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

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數組放在了 RAM 區(全局變量)。這意味著,這個變量仍可寫(通過指針
    發表于 10-19 10:05 ?444次閱讀
    <b class='flag-5'>const</b> 聲明的<b class='flag-5'>變量</b>不一定是只讀的?
    主站蜘蛛池模板: 欧美不卡1卡2卡三卡老狼 | 91伊人久久大香线蕉 | 国产免费久久精品99 | 亚洲资源在线播放 | 日本三级s级在线播放 | 91热成人精品国产免费 | 亚洲 成人 欧美 自拍 | 黄网站色成年片大免费软件 | 色噜噜狠狠色综合久 | 四虎永久在线精品 | 日本xxxxx69| 四虎永久在线精品网址 | 天天干天天谢 | 成人在线免费 | 男人午夜影院 | 女人张开腿让男人做爽爽 | 天天爱天天做天天爽 | 97精品伊人久久大香线蕉 | 午夜性刺激免费视频观看不卡专区 | 欧美456| 午夜三级国产精品理论三级 | 亚洲视频一区二区 | 色吧首页dvd | 天天操夜夜操天天操 | jiucao在线观看精品 | 玖玖玖精品视频免费播放 | 在线播放国产一区 | 四虎在线精品 | 欧美色图色就是色 | 欧美伦理一区二区三区 | 爽好舒服快小柔小说 | 狠狠干夜夜草 | 91大神在线视频观看 | 日本免费一区视频 | 亚洲无线视频 | 如色网| 女bbbbxxxx另类亚洲 | www.九色视频| 日本三级欧美三级香港黄 | 国模视频一区 | 日韩三级 |