免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
編程時const的那些細節(jié)!
本文主要跟大家講解一下C語言中const的那些事。

01

const在C和C++中

首先我們來看如下程序:

1#include <stdio.h>
2#include <stdlib.h>
3
4const int constSize = 5;
5int array[constSize] ={0};
6
7int main(int argc, char *argv[]) {
8
9    printf('Hello const\n'); 
10    return 0;
11}

假如把const修飾的名稱視為常量,那么其作為數(shù)組大小設置應該能夠通過編譯才對,而在Dev下編譯得到如下結果:

大體的意思是編譯器認為你在修改這個數(shù)數(shù)組,也就是說constSize是一個變量,程序正在用一個變量訪問一個數(shù)組,所以在C語言中const修飾的部分固定不變,但終究不是常量,而是一個只讀變量。

而同樣的程序在C++編譯環(huán)境中是可以編譯通過的,C++會編譯優(yōu)化認為其就是一個常量,所以可以用來初始化數(shù)組;當然如果你看到有些編譯器用變量作為了數(shù)組的初始化大小,那一般都是其擴展功能,這里就不展開描述了。

02

const修飾全局與局部

既然const是一個只讀變量,是變量就應該會有其地址,于是我們通過指針繞個道看能不能修改其值。
首先看看const修飾全局變量:

1#include <stdio.h>
2#include <stdlib.h>
3
4const int constVar = 5;
5
6int main(int argc, char *argv[]) {
7
8    int *pVar = (int*)&constVar;
9    *pVar = 10;
10    printf('constVar = %d\n',constVar); 
11    printf('Hello const\n'); 
12    return 0;
13}

然而不好意思的是編譯失敗,得到如下結果:

好吧,先不急著解釋,看看const修飾局部變量情況又是如何的,同樣修改如上代碼:

1#include <stdio.h>
2#include <stdlib.h>
3
4
5int main(int argc, char *argv[]) {
6    const int constVar = 5;
7    int *pVar = (int*)&constVar;
8
9    *pVar = 10;
10    printf('constVar = %d\n',constVar); 
11    printf('Hello const\n'); 
12    return 0;
13}

編譯運行,卻得到了正確的結果。

從上面的對比實驗可以看出,通過指針修改const全局變量區(qū)域的內(nèi)存會導致程序奔潰,而修改const局部變量區(qū)域的內(nèi)存可以得到正確結果。
對比兩者的匯編代碼你會發(fā)現(xiàn),這兩個變量位于不同的區(qū)域。

全局const其分配在全局地址區(qū)域,而局部const分配在堆棧上,通過指針修改const的值是一種與編譯器有關的行為,可以用指針修改堆棧上的局部變量,而全局變量const修飾以后為只讀區(qū)域,一旦程序訪問則會導致異常。

03

const修飾指針的老問題

雖然是一個老掉牙的問題,不過小哥還是在這里順便談談自己的理解,對于const修飾指針定義,最終處理的辦法是:去掉所有的類型,const右側表示什么,什么就不能被直接修改,如下所示:

1const int const * const pVar = &Var1;
2const int * const pVar       = &Var1;  
3int const * const pVar       = &Var1; 
4
5//根據(jù)規(guī)則簡化: const (* const (pVar)) --> *pVar和pVar均不可修改 

以上三種方式均是等價的,啥也不能被修改,地址和數(shù)據(jù)都為只讀,不管你在程序中采用*pVar作為左值還是pVar作為左值,編譯器均會報錯。

一旦你去掉其中一個const即可釋放一種訪問權限,比如:

1int * const pVar  = &Var1;  //可以訪問*pVar,而修改pVar便會報錯 
2const int  *pVar  = &Var1;  //可以訪問pVar,而修改*pVar便會報錯 

大多數(shù)人估計研究到這里就截止了,其實以上僅僅只是一級指針,而對于多級指針又會有這樣的實現(xiàn)技巧嗎?

同樣還是:'const右側的標識什么,什么就不能被直接修改',比如下面:

1const int * const * const pVar = 0xxxxxxxx;   //全都不能修改 
2      int * const * const pVar = 0xxxxxxxx;   //僅**pVar能夠修改 
3const int *  * const pVar = 0xxxxxxxx;        //僅*pVar能夠修改 

04

const的應用

小哥覺得const主要規(guī)范的是一種數(shù)據(jù)的權限問題 -- 只讀,這樣就為相關數(shù)據(jù)的安全性提供了保障,最常用的是與函數(shù)的形參配合,從而可以在一定程度上防止被函數(shù)內(nèi)部無故修改,認為是輸入?yún)?shù),比如經(jīng)常看到的形式:

1int sMempy(const int * pSrc, int * pDst)
2{
3    ////......
4} 

同時由于const修飾的變量為只讀屬性,所以在單片機中一般會把const修飾的變量放在Flash中,僅供程序讀取,這樣在一定程度上能夠節(jié)省RAM內(nèi)存。
本站僅提供存儲服務,所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
C語言中的const指針
C語言快速入門系列(7)
gcc編譯Const變量和enum變量生成目標文件分析
01、const修飾指針
const int *p與 int *const p區(qū)別
初探二維指針
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服