日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C与C++在const用法上的区别

發(fā)布時(shí)間:2025/1/21 c/c++ 87 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C与C++在const用法上的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ?首先,C和C++在大體結(jié)構(gòu)上不同,卻在語(yǔ)法上相同。 ?所以在使用的時(shí)候,我們會(huì)時(shí)常遇到一些莫名其妙的問(wèn)題,覺(jué)得語(yǔ)法上是正確的,但是編譯的時(shí)候卻出現(xiàn)一個(gè)紅色的 error! 比如今天我遇到的這個(gè)有意思的問(wèn)題。

? ? ?1. 今天看到一段代碼,覺(jué)得很有意思:

1 #pragma warning(disable : 4090) 2 3 #include<stdio.h> 4 5 int main(int argv, char args []) { 6 7 const int var = 4; 8 int *p = &var; 9 *p = 1; 10 printf("%d\n",var); 11 getchar(); 12 }

?答案很定不用說(shuō): ? ?1 ? ? ?原因也很簡(jiǎn)單: ?C弱類(lèi)型語(yǔ)言,C++是強(qiáng)類(lèi)型語(yǔ)言。 ?p指針指向了var的地址,并將var的值改變!

但是,我們?cè)倏纯?#xff0c;這個(gè)兩個(gè)代碼:

1 #include<iostream> 2 3 using namespace std; 4 5 int main(int args , char argv[]) { 6 7 const int var = 10; 8 std::cout << "var =" << var << std::endl; 9 // int * p= &var; --不能轉(zhuǎn)換,會(huì)報(bào)錯(cuò)! 10 //可以使用強(qiáng)制轉(zhuǎn)換 11 int *p = (int *)&var; 12 *p = 3; 13 std::cout << "*p =" << *p << std::endl; 14 int num[var]; 15 16 int i = 0; 17 //初始化 18 for (auto data : num) { 19 data =++i; 20 std::cout<<"num["<<i-1<<"] =" << data << std::endl; 21 } 22 getchar(); 23 return 0; 24 }

2. ?即便你用這個(gè)const_cast《》:強(qiáng)制去掉const屬性,但是*p=3,這條語(yǔ)句 ,p指向的地址的值任然沒(méi)有改變!這兩個(gè)代碼的值,都是這個(gè):

1 #include<iostream> 2 3 using namespace std; 4 5 int main(int args , char argv[]) { 6 7 const int var = 10; 8 std::cout << "var =" << var << std::endl; 9 // int * p= &var; --不能轉(zhuǎn)換,會(huì)報(bào)錯(cuò)! 10 //可以使用強(qiáng)制去掉const 屬性 11 int *p = const_cast<int *>(&var); 12 *p = 3; 13 std::cout << "*p =" << *p << std::endl; 14 std::cout << "var =" << var << std::endl; 15 int num[var]; 16 17 int i = 0; 18 //初始化 19 for (auto data : num) { 20 data =++i; 21 std::cout<<"num["<<i-1<<"] =" << data << std::endl; 22 } 23 getchar(); 24 return 0; 25 }

?

結(jié)果

為:?? 我們可以看到,var的值,沒(méi)有改變! ?原因是C++是強(qiáng)類(lèi)型語(yǔ)言,C++的數(shù)據(jù)的類(lèi)型更加嚴(yán)格與苛刻 ! ?

? ?當(dāng)然對(duì)于C++為何會(huì)出現(xiàn)指針的值為*p=3而var=10這樣的情況,其實(shí),*P所指的常量地址真實(shí)的內(nèi)存已經(jīng)修改了,但是編譯器并沒(méi)有從內(nèi)存地址中取值,而是直接從寄存器中取的值,所以var=10依舊表面上依舊沒(méi)有發(fā)生什么改變!

?

? ? ?2. ? 那么,對(duì)于指針而言呢? const 用到指針就會(huì)發(fā)揮大作用,可以設(shè)定權(quán)限,比如 ?int const * p ? / ?const int *p (這兩個(gè)其實(shí)可以看做是同一個(gè)類(lèi)型)均為常量指針, 還有 int * const p 指針常量,還有const int ?* const p ?;

? ? ? ? 根據(jù)它們的特性 ?權(quán)限如下:

? ? ? ? ? ? int ?const *p ? ? ? ?-----只能讀,不能寫(xiě),既然是指向常量的指針,當(dāng)然是可以指向其他常量的。

? ? ? ? ? ? int ?* ?const p ? ? -----能讀也能寫(xiě),但是既然是指針常量, 當(dāng)然是不能指向其他地址,無(wú)法修改其他地址的值。

? ? ?   int const * const p ? ?----能讀不能寫(xiě),而且無(wú)法指向其他地址的值。

? ? ? 這樣就可以設(shè)定權(quán)限,對(duì)于系統(tǒng)而言,這個(gè)是很安全而且很妥當(dāng)?shù)?#xff0c;還很power ! 當(dāng)然還可以運(yùn)用到指針函數(shù)什么的 ! 這樣const其實(shí)作用還是很有用初 的! ?特別是用在對(duì)安全要求很高的系統(tǒng),比如銀行的系統(tǒng)什么的?

總結(jié)

以上是生活随笔為你收集整理的C与C++在const用法上的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。