網(wǎng)站首頁 編程語言 正文
一、int const a / const int a
int 和const 都作為一個類型限定詞,有相同的地位,所以誰在前誰在后無所謂了,標題中的這兩種寫法是一致的。
這是我們常規(guī)的用途,我們發(fā)現(xiàn)這樣的話我們對a已經(jīng)不能做任何修改了。
int main() {
int const a = 10;
printf("%d\n",a);
return 0;
}
真的不能修改嗎?未必的
int main() {
int const a = 10;
int *p = &a;
*p = 20;
printf("%d\n",a);
return 0;
}
成功修改,這是為什么呢,其實也很簡單,這與編譯器有關,gcc編譯器中const是通過編譯器在編譯的時候執(zhí)行檢查來確保實現(xiàn)的,也就是檢查的時候我發(fā)現(xiàn)你沒有修改a的值,那我就認為你是對的。更深入一層的原因,是因為gcc把const類型的常量也放在了data段,其實和普通的全局變量放在data段是一樣實現(xiàn)的,只是通過編譯器認定這個變量是const的,運行時并沒有標記const標志,所以只要騙過編譯器就可以修改了。
這個本質(zhì)上是C語言的問題,因為C語言就沒有強制要求說const就是不能修改的,所以在C語言中使用const,就好象是 一種道德約束而非法律約束,所以大家使用const時更多是傳遞一種信息,就是告訴編譯器、也告訴讀程序的人,這個變量是不應該也不必被修改的。而且我的理解中,這個東西其實設置為了強制不可變在某種程度上不也就限制了C語言的靈活性嘛,c的奇淫巧技不就依靠C語言的靈活性實現(xiàn)的嘛,所謂bug變特性,我的猜測哈,不知道丹尼斯·里奇是不是也是這么想的。
二、const int(*p)/int const(*p)
其實標題是很好理解的,我們修飾了*p,使得p的指向不能被改變了。
int main() {
int a = 10;
int const (*p) = &a;
printf("%d\n",*p);
return 0;
}
上面的程序很好理解,p指向了a,p被const修飾,指向的對象a已經(jīng)不能被修改了,下面的程序輸出20就說明出了問題,這個還是上面我們講到的那個問題,這是一個君子約定。
int main() {
int a = 10;
int const (*p) = &a;
a = 20;
printf("%d\n",*p);
return 0;
}
下面的四種寫法等價
int const (*p)
const int (*p)
int const *p
const int *p
三、int*const p
那么如何聲明一個自身是常量指針呢?方法是讓const盡可能的靠近p,下面的這個就是
int main() {
int a = 10;
int b = 20;
int* const p = &a;
printf("%d\n",*p);
return 0;
}
指針只能指向a,指向b就報錯。地址只能賦值一次。
這里有一個簡便的區(qū)分方法:沿著*號劃一條線,如果const位于*的左側,則const就是用來修飾指針所指向的變量,即指針指向為常量.如果const位于*的右側,const就是修飾指針本身,即指針本身是常量。
四、const用于函數(shù)的地址傳遞參數(shù)
void func(const int *p);
這種形式通常用于在數(shù)組形式的參數(shù)中模擬傳值調(diào)用。也就是相當于函數(shù)調(diào)用者聲稱:"我給你一個指向它的指針,但你不能去修它。"如果函數(shù)編寫者遵循了這個約定,那么就相當于模擬了值傳遞。這也是const最有用之處了:用來限定函數(shù)的形參,這樣該函數(shù)將不會修改實參指針所指的數(shù)據(jù)。這里注意了,是函數(shù)不應該去修改而不是不能修改,也就是說const不能阻止參數(shù)的修改(原因見上)。
原文鏈接:https://blog.csdn.net/weixin_43903639/article/details/123979304
相關推薦
- 2022-11-13 python學習之whl文件解釋與安裝詳解_python
- 2022-10-24 C++??STL?_?Vector使用及模擬實現(xiàn)_C 語言
- 2022-07-02 C++中關于互斥量的全面認知_C 語言
- 2022-12-30 python算法與數(shù)據(jù)結構朋友圈與水杯實驗題分析實例_python
- 2022-08-12 Pandas中DataFrame常用操作指南_python
- 2022-07-01 淺談為什么#{}可以防止SQL注入_MsSql
- 2022-10-11 tidb-系統(tǒng)內(nèi)核調(diào)優(yōu)及對比
- 2023-06-16 GO語言中Chan實現(xiàn)原理的示例詳解_Golang
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支