網站首頁 編程語言 正文
1 介紹
const關鍵字是constant的縮寫,翻譯為常量、常數。在C語言中const的作用很強大,它可以修飾變量、數組、指針、函數參數等。
1.1 const修飾變量
const修飾變量,表示希望此變量具有只讀性,防止被直接直接修改。
//const關鍵字是constant的縮寫,翻譯為常量、常數。
//在C語言中const的作用很強大,它可以修飾變量、數組、指針、函數參數等。
#include<stdio.h>
int main()
{
const int num = 100;
num = 20;
printf("%d\n", num);
}
發現const 修飾的變量,隨后試圖修改num的值,結果出現紅色波浪線,編譯器提醒我們:表達式必須是可修改的左值。
所以我們得出結論:const修飾的變量,不能被修改。
const修飾的變量就一定不能被修改嗎???
const int num = 100;
int *p = #
*p= 20;
printf("%d\n", num);
運行結果
通過上圖我們發現num的值被修改了,通過指針可以間接的修改const修飾的變量。
但是運行時會出現警告:warning C4090: “初始化”: 不同的“const”限定符。
是因為num類型是const修飾,但是p是整型指針變量 ,
類型不同。所以通過下面強轉就沒警告了。
改進后的代碼
const int num = 100;
int *p = (int*)#
*p= 20;
printf("%d\n", num);
總結:const修飾的變量不能被直接修改
1.2 const修飾數組
#include<stdio.h>
int main()
{
const int array[5] = { 0,1,2,3,4 };
array[0] = 100;
}
表示const修飾的數組也不能被修改。
通過上面1.1const修飾變量的分析,同理也聯想到:指針是否可以修改數組的內容。結果如下:
#include<stdio.h>
int main()
{
const int array[5] = { 0,1,2,3,4 };
//array[0] = 100;
int *p = array;
*p = 100;
printf("%d\n", array[0]);
}
不難發現,指針可以修改。和1.1節出現結果一樣,同樣運行時程序出現了警告:warning C4090: “初始化”: 不同的“const”限定符,同樣的警告出現了。
經過強轉后:
#include<stdio.h>
int main()
{
const int array[5] = { 0,1,2,3,4 };
//array[0] = 100;
int *p = (int *)array;//array原本的數據類型為const int[5]
*p = 100;
printf("%d\n", array[0]);
}
總結:const修飾數組時,其值不能被直接修改
1.3 const修飾指針
此部分分為兩種情況去分析:
#include<stdio.h>
int main()
{
int a = 100;
const int *p = &a;
*p = 1000;
printf("%d\n", a);
}
此時,通過上圖容易發現const修飾指針指向的內容一旦修改,就會自動報錯,所以*p(指針指向的內容不能被修改),但指針變量p本身是可以被修改的。
#include<stdio.h>
int main()
{
int a = 100;
int* const p = &a;//p的數據類型為int *const
*p = 1000;
printf("%d\n", a);
}
此時,const修飾的是指針p本身,所以指針本身不能被修改,但是指針所指向的內容*p可被修改
1.4 const修飾函數參數
#include<stdio.h>
int myFunc(const int* p)
{
*p = *p + 1;
return *p;
}
const修飾函數參數,對參數起到限定的作用, 通過發現指針也能修改其值。
總結:const修飾函數參數,本質上和修飾變量和指針一樣。表示其值不能被直接修改。
2 const對程序的影響
可以發現,在*p下面出現了紅色波浪線,讓上述的錯誤提前出現,避免程序在運行時出錯。
總結:編譯器可以對const修飾的變量進行合理性檢查,讓錯誤提前出現。
3 總結
通過這篇博客,我對const修飾變量、數組、指著和函數參數進行了歸納總結。總體來說有幾個點需要注意:
const修飾變量,不能被直接修改
const修飾指針指向的內容時(const int * p=&a),指針指向內容(*p)不能被修改,但指針本身(p)可以被修改。
const修飾指針本身時(int * const p =&a),指針指向的內容(*p)可以被修改,但是指針本身(p)不能被修改。
const 修飾字符串 (const *p=“abcd”;)和(const p[]=“abcd”;)這兩種情況的分析,前者字符串不能修改,后者字符串可以修改。這?? ?是由C語言使用存儲器的方式決定的。
補充內容
char *cards = “JQK”; 的情況下計算機操作的步驟:
計算機做的步驟:
計算機加載字符串字面值:
當計算機把程序載入存儲器時,會把所有常數值(如字符串常量"JQK")放到常量存儲區,這部分存儲器是只讀的。
程序在棧上創建cards變量
棧是存儲器中計算機用來保存局部變量的部分,局部變量也就是位于函數內部的變量,cards變量就在這個地方。
cards變量設為"JQK"的地址
cards變量將會保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲器中。
計算機試圖修改字符串
程序試圖修改cards變量指向的字符串中的內容時就會失敗,因為字符串是只讀的。
char cards[] = “JQK”;的情況下計算機操作的步驟:
計算機加載字符串字面值:
當計算機把程序載入存儲器時,會把所有常數值(如字符串常量"JQK")放到常量存儲區,這部分存儲器是只讀的。
程序在棧上新建了一個數組
我們聲明了數組,所以程序會創建一個足夠大的數組來保存字符串"JQK"
程序初始化數組
除了為數組分配空間,程序還會把字符串字面值"JQK"的內容復制到棧上。
補充內容
char *cards = “JQK”; 的情況下計算機操作的步驟:
計算機做的步驟:
計算機加載字符串字面值:
當計算機把程序載入存儲器時,會把所有常數值(如字符串常量"JQK")放到常量存儲區,這部分存儲器是只讀的。
程序在棧上創建cards變量
棧是存儲器中計算機用來保存局部變量的部分,局部變量也就是位于函數內部的變量,cards變量就在這個地方。
cards變量設為"JQK"的地址
cards變量將會保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲器中。
計算機試圖修改字符串
程序試圖修改cards變量指向的字符串中的內容時就會失敗,因為字符串是只讀的。
char cards[] = “JQK”;的情況下計算機操作的步驟:
計算機加載字符串字面值:
當計算機把程序載入存儲器時,會把所有常數值(如字符串常量"JQK")放到常量存儲區,這部分存儲器是只讀的。
程序在棧上新建了一個數組
我們聲明了數組,所以程序會創建一個足夠大的數組來保存字符串"JQK"
程序初始化數組
除了為數組分配空間,程序還會把字符串字面值"JQK"的內容復制到棧上。
區別:
原來的代碼使用了指向只讀字符串字面值的指針;而在第二段代碼中,用字符串字面值初始化了一個數組,從而得到了這些字母的副本,這樣就可以隨意修改他們了。
原文鏈接:https://blog.csdn.net/weixin_40933653/article/details/126350954
相關推薦
- 2022-09-14 Python深入淺出分析enum枚舉類_python
- 2022-04-01 Fatal Python error: Py_Initialize: unable to load
- 2022-05-21 C++多線程互斥鎖和條件變量的詳解_C 語言
- 2022-09-25 阿里云服務器如何部署ssl證書即https的設置,以及為ip部署ssl
- 2022-06-01 Python學習之內置函數總結_python
- 2022-10-21 golang?一次性定時器Timer用法及實現原理詳解_Golang
- 2024-01-27 ioc,ioc實際運用
- 2022-10-03 github訪問速度慢的問題完美解決_相關技巧
- 最近更新
-
- 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同步修改后的遠程分支