成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入聊一下 Const 關鍵字

開發 前端
const是一個C語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程序上可以提高程序的健壯性,另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解別人的程序有所幫助。

const是一個C語言的關鍵字,它限定一個變量不允許被改變。使用const在一定程序上可以提高程序的健壯性,另外,在觀看別人代碼的時候,清晰理解const所起的作用,對理解別人的程序有所幫助。

01const簡述

下面簡單描述一下const,基本都是教科書的知識。const修飾的變量,其值存放在只讀數據段中,其值不能被改變。稱為只讀變量。關于什么是數據段,什么是代碼段,請看我之前的文章《C語言的內存分配》。

int const a;
const int a;


上面兩條語句都可以將a聲明為一個整數,它的值不能被修改。這兩種方式你可以任意選一種即可。

常量在定義時可以被初始化。

int const a =15;


當指針和常量結合時,就會很有趣,因為有兩樣東西都可能成為常量,指針和它指向的實體。一般大家在大學考計算機二級和面試時經常會遇到的。

int *a;


a就是一個很普通的指向整型的指針。

int const *a;


這時則是一個指向整型常量的指針。也就是說,你可以修改指針的值,但是不能修改它指向的值。

int *const a;


這時a是一個指向整型的常量指針。這個指針是常量,它的值無法修改,但是你可以修改它所指向的整型的值。

int const *const a;


這個時候無論是指針本身還是它所指向的值都是常量,都不允許修改。

那么問題來了,就像C語言的運算符的優先級,這個東西很不好記憶,在實際開發中,我們直接多用()符號解決優先級的問題。上面指針和const結合那么麻煩,學習為了什么呢?

1、合理地使用關鍵字const可以使編譯器很自然地保護那些不希望被改變的參數,防止其被無意的代碼修改。簡而言之,這樣可以減少bug的出現。

2、正是基于上面的原因,一些優秀的開源代碼都會利用const這個屬性,深入理解后,方便我們閱讀理解一些優秀的開源代碼。

02常量的應用

上文就簡述了一下教科書中的const定義,現在說一下const在我日常開發中的應用。

在單片機開發中

const定義一個常量,在單片機開發中,一個定義在函數體外的常量constint a = 5; 它是存儲在單片機內部Flash里的,不懂的同學請看之前的文章《C語言在STM32中的內存分配》。那么上文提到和指針結合時,也是存儲在內部Flash中嗎?我們來驗證一下

int data = 0x1234;
int const *a = &data;
int *const b= &data;
int const *const c= &data;
int main(void)
{
int data1 = 0x1234;
a =&data1;
data1 = *b;
data1 = *c;
while(1);
}


它們的內存分配如下

b和c是分配到內部flash的,a是分配到ram中的。其實這也很好理解,根據上面的const的定義,單片機在分配時,將不能修改的變量,也就是只讀變量放到flash中,可以讀寫的變量放到ram中,這個大家仔細想一下就明白了。

常量作為函數的參數

非指針參數(也就是傳值參數)不會被修改原始值,const對它是沒有意義的,所以這里只討論參數是指針加const的情況。

在上面看到,指針加const共3種情況,這里先討論int const *a; 也就是你可以修改指針的值,但是不能修改它指向的值。

int fun(int *p) 
{
if(*p == 0xA5)
{
return*p;
}else{
p++;
return *p;
}
}


上面是個簡單的例子,也就是傳入一個指針,函數讀取指針指向的內容,執行不同的命令。類似串口接收,一個函數內部處理這些數據,但是不能修改,可能串口接收的數據在其他地方還有用。

在上述例子中,沒有問題的,因為代碼全在“掌控”中。函數內部是否進行寫操作,自己是知道的。但還有一個更規范的寫法。

int fun(int const *p) 
{
if(*p == 0xA5)
{
return *p;
}else{
p++;
return *p;
}
}


這里寫法,就是明顯表現出自己的設計意圖,函數內部不可以對指針指向的內容進行修改,只能讀取。

如果嘗試修改,編譯器會直接報錯的。但是函數內部也是可以繞過去,修改的數據的,如下

int fun(const int *p) 
{
int *p2 = p; /* 來個重名指針會繞過const的限制*/
*p2 += 1;
return*p;
}


那么對于int *const a;有沒有對應的使用場景呢?如下

這樣的接口設計,如果函數內部嘗試修改指針的值,也就是指針指向的位置,編譯器就會直接報錯。

不過這里例子很現實,因為即使去掉p2的const修飾,編譯器會直接報waring,因為p2是入參。這里只是簡單舉例子,大家理解意思就好。

在日常開發中,入參是intconst *a; 使用場景比較多。

C++中應用加const

C++中可以使用應用的語法,這里不再展開什么是應用,如下例子,C++函數參數中引用時也常加const修飾,如下

void find(constint  &x)
{
.......
}


最后,舉兩個常用的標準C庫函數聲明,它們都是使用const的典范。

1.字符串拷貝函數:char*strcpy(char*strDest,constchar *strSrc);

2.返回字符串長度函數:intstrlen(constchar *str);

03#define和const

#define預編譯和const在某些情況下有些“混淆”,如下

#define MAX_NUM 5
int const max_num = 5;
void fun(){
if(len >MAX_NUM)
if(len> max_num)
}


上述代碼5行和6行都能起效果。那么我們就詳細分析一下它們的區別

1、#define的數據是宏定義,它占用的是代碼段空間(單片機對應:內部flash),const定義一個數據類型,它占用的是data段(單片機對應:內部ram)。

2、如上,#define是宏定義,在預編譯階段直接替換,而const是數據類型。

#define MAX_NUM 5
int const max_num = 5;
int data[MAX_NUM];
intdata2[max_num];


上述代碼第4行是編譯不過的,因為max_num是一個int的數據類型變量,數組定義的長度不能用變量。實際上,在更章節第一個例子,只用于判斷長度,#define更加合適,因為只要允許使用字面值常量的地方都可以使用宏定義。

3、define只是簡單的字符串替換,沒有類型檢查。而const有對應的數據類型,是要進行判斷的,可以避免一些低級的錯誤。define只是簡單的字符串替換會導致邊界效應,

比如定義

#define A 1
#define B A+3
#define C A/B3


那么c是多少呢?c=A/B3=A/A+33=1/1+33=10;所以這種用的時候可以直接都用個括號括起來,就不怕邊界效應了。

4、const不能重定義,不可以定義兩個一樣的,而define就比較牛氣了,它通過undef取消某個符號的定義,再重新定義。并還可以用于判斷宏定義是否存在,常用于頭文件防止頭文件被重復引用。

#ifndef GRAPHICS_H //防止graphics.h被重復引用 
#defineGRAPHICS_H
……代碼……
#endif


5、const常量可以進行調試的,define是不能進行調試的,主要是預編譯階段就已經替換掉了,調試的時候就沒它了。

本文轉載自微信公眾號「知曉編程」,可以通過以下二維碼關注。轉載本文請聯系知曉編程公眾號。

責任編輯:武曉燕 來源: 知曉編程
相關推薦

2012-03-01 12:50:03

Java

2022-06-29 08:05:25

Volatile關鍵字類型

2024-02-23 18:04:37

C++const關鍵字

2021-04-21 14:19:52

javaignalHandle接口

2011-05-17 13:04:20

Cconst

2021-07-28 06:53:02

C++Const指針傳遞

2019-09-04 14:14:52

Java編程數據

2024-11-20 15:55:57

線程Java開發

2025-01-10 11:07:28

2015-11-10 16:10:22

C語言StaticConst

2009-12-08 18:02:06

PHP final關鍵

2021-04-27 07:52:18

SQLNULLOR

2025-04-22 08:16:37

refC#參數

2023-10-04 00:04:00

C++extern

2021-06-30 00:19:43

AOP動態代理

2021-04-21 21:06:11

數據結構

2020-11-11 08:45:48

Java

2009-09-17 09:30:00

Linq LET關鍵字

2022-01-04 16:35:42

C++Protected關鍵字

2009-09-02 09:24:03

C# this關鍵字
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91精品久久久久久久网曝门 | 欧美久久一区二区 | 国产麻豆乱码精品一区二区三区 | 欧美日韩精品综合 | 国产精品永久免费视频 | 日韩一区二区在线免费观看 | 欧美日韩国产一区二区三区 | 91精品国产91久久久久久吃药 | 中文在线播放 | 97久久精品午夜一区二区 | 色婷婷av一区二区三区软件 | 国产欧美日韩综合精品一区二区 | 亚洲国产精品福利 | 激情 亚洲| 国产欧美日韩在线一区 | 亚洲午夜精品视频 | 一级黄色片网址 | 婷婷综合网 | 亚洲伊人精品酒店 | 日韩欧美在线观看一区 | 精品欧美一区二区三区精品久久 | 欧美a级成人淫片免费看 | 午夜精品在线观看 | 午夜精品久久久久久久 | 国产精品久久国产精品久久 | 好好的日在线视频 | 欧美久久免费观看 | 国产视频三级 | 久久久女女女女999久久 | 午夜资源 | 播放一级毛片 | 久久av一区二区 | 91在线观看 | 激情久久网| 丁香五月网久久综合 | 国产午夜久久久 | 日韩第一页 | 色.com| 久久久久久久久久久一区二区 | 久久久久久精 | 国产精品一区二区日韩 |