網站首頁 編程語言 正文
const 與指針
我們寫一段代碼來探究以下
int a = 10, b = 20; int* p1 = &a; *p1 = 100; p1 = &b; const int* p2 = &a; int const* p3 = &a; int* const p4 = &a; const int* const p5 = &a;
在上面?const int* p2;
與int const* p3= &a;
是等價的
const在星號的左邊,我們的const修飾的是指向能力,也就是說我們可以改變p2的自身值,但是不能修改 *p2 的值;
int x = *p2;
*p2 = 100; // err 是錯誤的
p2 = &b; //是正確的
const在星號的右邊,我們p4自身值不能改變,但是可以改變 *p4 的值
int x = *p4;
*p4 = 100; // 是正確的
p4 = &b; //err 是錯誤的
而p5既不能改變自身值也不可以改變 *p5 的值
我們現在看下面的代碼,來探討哪一句正確哪一句錯誤
int a = 10,b = 20;const int *p = &a; *p 不能改int *s0 = p; 使得 *p 可改 const int *s1 = p; *p不可改int * const s2 = p; *p可改 s2 不可改const int * const s3 = p;*p不可改 s3 不可改
我們對const int* p = &a;
分析,可以看出const修飾使得 *p 不可以修改;繼而分析下面的代碼是否會對 *p 產生修改
首先我們可以看出我們的 s0 s1 s2 s3 都等于 p 繼而 *s1 *s2 *s3 *p 都是a,我們之前提到過能力可以收縮,而不可以擴展;
1.s0等價于p,而我們對*s0可以進行修改,繼而是錯誤的;
2.const修飾 *s1,所以我們無法修改 *s1,可以修改s1,繼而是正確的;
3.cosnt修飾s2,我們可以修改*s2,而不能修改s2,所以是錯誤的;
4.我們既不可以修改s4也不可以修改 *s4 ,所以是正確的
我們再來看這樣一段代碼,這次我們將對p進行const修飾
int a = 10,b = 20; int * const p = &a; p不能改 int *s0 = p; s0可改 *s0 == *p 可改 const int *s1 = p; *s1 不可改 s1可改 int * const s2 = p; s2不可改 *s2可改 const int * const s3 = p; s3不可改 *s3不可改
我們對int* const p = &a;
分析,這次我們的const修飾p,使得p的值不能修改,而 *p 可以修改,接著分析下面的代碼
首先于上面一樣, s0 s1 s2 s3 都等于 p 繼而 s1 s2 s3 p 都是a
1.s0 與 p相等,我們可以修改*p 可以修改s0,但是對p并沒有進行修改,所以是正確的
2.const修飾 *s1,我們不能修改 *s1,可以修改s1,與p無關所以是正確的
3.const修飾 s2 ,我們不能修改 s2,可以修改*s2,與p無關所以是正確的
4.這里我們同樣既不可以修改 s3,也不可以修改 *s3,同樣與p無關,所以是正確的
如果我們通過強制轉換使得通過常量地址改變該值
int main() { const int a = 10; int b = 0; int *p = (int*)&a; *p = 100; b = a; cout<<"a="<<a<<"b="<<b<<"*p="<<*p<<endl; }
對于c++,我們產生的結果為a=10,b=10,*p=100
,對于b=a,依舊給b賦值的是10
造成這樣的原因實際上是因為C++編譯會將常量a進行數值替換,繼而b=a變成了b=10,C++對于常變量當作常量
當使用c語言編譯這段代碼
int main() { const int a = 10; int b = 0; int *p = (int*)&a; *p = 100; b = a; printf("a=%d b=%d *p=%d\n",a,b,*p); return 0; }
得到的值為a=100,b=100,*p=100
const 與引用
我們寫一段代碼來看看const 與引用的關系
int a = 10,b = 20; int *p = &a; int *s = p; int *&pref = p; //給p起了一個別命pref int &*pref = p; //錯誤!!!
int &*pref = p;
是錯誤的,該代碼是一個指針指向的是一個引用,是不允許編譯通過的,因為在語法規則上引用不具有地址,即使引用可以進行取地址,但是是不容許這樣做的,也就是我們可以定義一個引用去引用指針,而不能定義一個指針去指向引用
const 與指針、引用
我們在寫一段代碼詳細探討
int a = 10; int *s = &a; int *&p1 = s; const int *&p2 = p; int * const &p3 = p; int * & const p4 = p;
總結
原文鏈接:https://blog.csdn.net/XXXTENTAC1ON/article/details/122350772
相關推薦
- 2022-04-05 ORA-01779: 無法修改與非鍵值保存表對應的列
- 2023-07-28 Cannot read properties of undefined (reading ‘push
- 2022-04-15 C語言各種操作符透徹理解下篇_C 語言
- 2022-12-04 Android自定義View繪制貝塞爾曲線實現流程_Android
- 2022-09-20 C#使用winform實現進度條效果_C#教程
- 2022-10-29 Spring的純注解配置詳解
- 2022-09-24 React報錯之Object?is?possibly?null的問題及解決方法_React
- 2022-03-23 Asp.Net?Core?使用Monaco?Editor?實現代碼編輯器功能_實用技巧
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支