C語言const關(guān)鍵字的用法詳解
1 介紹
const關(guān)鍵字是constant的縮寫,翻譯為常量、常數(shù)。在C語言中const的作用很強(qiáng)大,它可以修飾變量、數(shù)組、指針、函數(shù)參數(shù)等。
1.1 const修飾變量
const修飾變量,表示希望此變量具有只讀性,防止被直接直接修改。
//const關(guān)鍵字是constant的縮寫,翻譯為常量、常數(shù)。 //在C語言中const的作用很強(qiáng)大,它可以修飾變量、數(shù)組、指針、函數(shù)參數(shù)等。 #include<stdio.h> int main() { const int num = 100; num = 20; printf("%d\n", num); }
發(fā)現(xiàn)const 修飾的變量,隨后試圖修改num的值,結(jié)果出現(xiàn)紅色波浪線,編譯器提醒我們:表達(dá)式必須是可修改的左值。
所以我們得出結(jié)論:const修飾的變量,不能被修改。
const修飾的變量就一定不能被修改嗎???
const int num = 100; int *p = # *p= 20; printf("%d\n", num);
運行結(jié)果
通過上圖我們發(fā)現(xiàn)num的值被修改了,通過指針可以間接的修改const修飾的變量。
但是運行時會出現(xiàn)警告:warning C4090: “初始化”: 不同的“const”限定符。
是因為num類型是const修飾,但是p是整型指針變量 ,
類型不同。所以通過下面強(qiáng)轉(zhuǎn)就沒警告了。
改進(jìn)后的代碼
const int num = 100; int *p = (int*)# *p= 20; printf("%d\n", num);
總結(jié):const修飾的變量不能被直接修改
1.2 const修飾數(shù)組
#include<stdio.h> int main() { const int array[5] = { 0,1,2,3,4 }; array[0] = 100; }
表示const修飾的數(shù)組也不能被修改。
通過上面1.1const修飾變量的分析,同理也聯(lián)想到:指針是否可以修改數(shù)組的內(nèi)容。結(jié)果如下:
#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]); }
不難發(fā)現(xiàn),指針可以修改。和1.1節(jié)出現(xiàn)結(jié)果一樣,同樣運行時程序出現(xiàn)了警告:warning C4090: “初始化”: 不同的“const”限定符,同樣的警告出現(xiàn)了。
經(jīng)過強(qiáng)轉(zhuǎn)后:
#include<stdio.h> int main() { const int array[5] = { 0,1,2,3,4 }; //array[0] = 100; int *p = (int *)array;//array原本的數(shù)據(jù)類型為const int[5] *p = 100; printf("%d\n", array[0]); }
總結(jié):const修飾數(shù)組時,其值不能被直接修改
1.3 const修飾指針
此部分分為兩種情況去分析:
#include<stdio.h> int main() { int a = 100; const int *p = &a; *p = 1000; printf("%d\n", a); }
此時,通過上圖容易發(fā)現(xiàn)const修飾指針指向的內(nèi)容一旦修改,就會自動報錯,所以*p(指針指向的內(nèi)容不能被修改),但指針變量p本身是可以被修改的。
#include<stdio.h> int main() { int a = 100; int* const p = &a;//p的數(shù)據(jù)類型為int *const *p = 1000; printf("%d\n", a); }
此時,const修飾的是指針p本身,所以指針本身不能被修改,但是指針?biāo)赶虻膬?nèi)容*p可被修改
1.4 const修飾函數(shù)參數(shù)
#include<stdio.h> int myFunc(const int* p) { *p = *p + 1; return *p; }
const修飾函數(shù)參數(shù),對參數(shù)起到限定的作用, 通過發(fā)現(xiàn)指針也能修改其值。
總結(jié):const修飾函數(shù)參數(shù),本質(zhì)上和修飾變量和指針一樣。表示其值不能被直接修改。
2 const對程序的影響
可以發(fā)現(xiàn),在*p下面出現(xiàn)了紅色波浪線,讓上述的錯誤提前出現(xiàn),避免程序在運行時出錯。
總結(jié):編譯器可以對const修飾的變量進(jìn)行合理性檢查,讓錯誤提前出現(xiàn)。
3 總結(jié)
通過這篇博客,我對const修飾變量、數(shù)組、指著和函數(shù)參數(shù)進(jìn)行了歸納總結(jié)??傮w來說有幾個點需要注意:
const修飾變量,不能被直接修改
const修飾指針指向的內(nèi)容時(const int * p=&a),指針指向內(nèi)容(*p)不能被修改,但指針本身(p)可以被修改。
const修飾指針本身時(int * const p =&a),指針指向的內(nèi)容(*p)可以被修改,但是指針本身(p)不能被修改。
const 修飾字符串 (const *p=“abcd”;)和(const p[]=“abcd”;)這兩種情況的分析,前者字符串不能修改,后者字符串可以修改。這 是由C語言使用存儲器的方式?jīng)Q定的。
補(bǔ)充內(nèi)容
char *cards = “JQK”; 的情況下計算機(jī)操作的步驟:
計算機(jī)做的步驟:
計算機(jī)加載字符串字面值:
當(dāng)計算機(jī)把程序載入存儲器時,會把所有常數(shù)值(如字符串常量"JQK")放到常量存儲區(qū),這部分存儲器是只讀的。
程序在棧上創(chuàng)建cards變量
棧是存儲器中計算機(jī)用來保存局部變量的部分,局部變量也就是位于函數(shù)內(nèi)部的變量,cards變量就在這個地方。
cards變量設(shè)為"JQK"的地址
cards變量將會保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲器中。
計算機(jī)試圖修改字符串
程序試圖修改cards變量指向的字符串中的內(nèi)容時就會失敗,因為字符串是只讀的。
char cards[] = “JQK”;的情況下計算機(jī)操作的步驟:
計算機(jī)加載字符串字面值:
當(dāng)計算機(jī)把程序載入存儲器時,會把所有常數(shù)值(如字符串常量"JQK")放到常量存儲區(qū),這部分存儲器是只讀的。
程序在棧上新建了一個數(shù)組
我們聲明了數(shù)組,所以程序會創(chuàng)建一個足夠大的數(shù)組來保存字符串"JQK"
程序初始化數(shù)組
除了為數(shù)組分配空間,程序還會把字符串字面值"JQK"的內(nèi)容復(fù)制到棧上。
補(bǔ)充內(nèi)容
char *cards = “JQK”; 的情況下計算機(jī)操作的步驟:
計算機(jī)做的步驟:
計算機(jī)加載字符串字面值:
當(dāng)計算機(jī)把程序載入存儲器時,會把所有常數(shù)值(如字符串常量"JQK")放到常量存儲區(qū),這部分存儲器是只讀的。
程序在棧上創(chuàng)建cards變量
棧是存儲器中計算機(jī)用來保存局部變量的部分,局部變量也就是位于函數(shù)內(nèi)部的變量,cards變量就在這個地方。
cards變量設(shè)為"JQK"的地址
cards變量將會保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲器中。
計算機(jī)試圖修改字符串
程序試圖修改cards變量指向的字符串中的內(nèi)容時就會失敗,因為字符串是只讀的。
char cards[] = “JQK”;的情況下計算機(jī)操作的步驟:
計算機(jī)加載字符串字面值:
當(dāng)計算機(jī)把程序載入存儲器時,會把所有常數(shù)值(如字符串常量"JQK")放到常量存儲區(qū),這部分存儲器是只讀的。
程序在棧上新建了一個數(shù)組
我們聲明了數(shù)組,所以程序會創(chuàng)建一個足夠大的數(shù)組來保存字符串"JQK"
程序初始化數(shù)組
除了為數(shù)組分配空間,程序還會把字符串字面值"JQK"的內(nèi)容復(fù)制到棧上。
區(qū)別:
原來的代碼使用了指向只讀字符串字面值的指針;而在第二段代碼中,用字符串字面值初始化了一個數(shù)組,從而得到了這些字母的副本,這樣就可以隨意修改他們了。
到此這篇關(guān)于C語言const關(guān)鍵字的用法詳解的文章就介紹到這了,更多相關(guān)C語言const內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ qsort 與sort 對結(jié)構(gòu)體排序?qū)嵗a
這篇文章主要介紹了c++ qsort 與sort 對結(jié)構(gòu)體排序?qū)嵗a,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下2020-11-11簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法
fork()函數(shù)只能在類Unix系統(tǒng)下使用,因為需要引入unistd頭文件,這里我們就來簡單掌握Linux系統(tǒng)中fork()函數(shù)創(chuàng)建子進(jìn)程的用法,需要的朋友可以參考下2016-06-06C++實現(xiàn)LeetCode(24.成對交換節(jié)點)
這篇文章主要介紹了C++實現(xiàn)LeetCode(24.成對交換節(jié)點),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07