01
const在C和C++中
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修飾全局與局部
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}
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}
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的應用
1int sMempy(const int * pSrc, int * pDst)
2{
3 ////......
4}