欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言const關(guān)鍵字的用法詳解

 更新時(shí)間:2022年08月18日 11:08:30   作者:Love coldplay  
今天探討const,首先來(lái)說(shuō)是將變量常量化。為什么要將變量常量化,原因有諸多好處有諸多。比如可以使數(shù)據(jù)更加安全不會(huì)被修改

1 介紹

const關(guān)鍵字是constant的縮寫,翻譯為常量、常數(shù)。在C語(yǔ)言中const的作用很強(qiáng)大,它可以修飾變量、數(shù)組、指針、函數(shù)參數(shù)等。

1.1 const修飾變量

const修飾變量,表示希望此變量具有只讀性,防止被直接直接修改。

//const關(guān)鍵字是constant的縮寫,翻譯為常量、常數(shù)。
//在C語(yǔ)言中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 = &num;
	*p= 20;
	printf("%d\n", num);

運(yùn)行結(jié)果

通過(guò)上圖我們發(fā)現(xiàn)num的值被修改了,通過(guò)指針可以間接的修改const修飾的變量。

但是運(yùn)行時(shí)會(huì)出現(xiàn)警告:warning C4090: “初始化”: 不同的“const”限定符。

是因?yàn)閚um類型是const修飾,但是p是整型指針變量 ,

類型不同。所以通過(guò)下面強(qiáng)轉(zhuǎn)就沒(méi)警告了。

改進(jìn)后的代碼

    const int num = 100;
	int *p = (int*)&num;
	*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ù)組也不能被修改。

通過(guò)上面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é)果一樣,同樣運(yùn)行時(shí)程序出現(xiàn)了警告:warning C4090: “初始化”: 不同的“const”限定符,同樣的警告出現(xiàn)了。

經(jīng)過(guò)強(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ù)組時(shí),其值不能被直接修改

1.3 const修飾指針

此部分分為兩種情況去分析:

#include<stdio.h>
int main()
{
	int a = 100;
	const int *p = &a;
	*p = 1000;
	printf("%d\n", a);
}

此時(shí),通過(guò)上圖容易發(fā)現(xiàn)const修飾指針指向的內(nèi)容一旦修改,就會(huì)自動(dòng)報(bào)錯(cuò),所以*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);
}

此時(shí),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ù),對(duì)參數(shù)起到限定的作用, 通過(guò)發(fā)現(xiàn)指針也能修改其值。

總結(jié):const修飾函數(shù)參數(shù),本質(zhì)上和修飾變量和指針一樣。表示其值不能被直接修改。

2 const對(duì)程序的影響

可以發(fā)現(xiàn),在*p下面出現(xiàn)了紅色波浪線,讓上述的錯(cuò)誤提前出現(xiàn),避免程序在運(yùn)行時(shí)出錯(cuò)。

總結(jié):編譯器可以對(duì)const修飾的變量進(jìn)行合理性檢查,讓錯(cuò)誤提前出現(xiàn)。

3 總結(jié)

通過(guò)這篇博客,我對(duì)const修飾變量、數(shù)組、指著和函數(shù)參數(shù)進(jìn)行了歸納總結(jié)??傮w來(lái)說(shuō)有幾個(gè)點(diǎn)需要注意:

const修飾變量,不能被直接修改
const修飾指針指向的內(nèi)容時(shí)(const int * p=&a),指針指向內(nèi)容(*p)不能被修改,但指針本身(p)可以被修改。
const修飾指針本身時(shí)(int * const p =&a),指針指向的內(nèi)容(*p)可以被修改,但是指針本身(p)不能被修改。
const 修飾字符串 (const *p=“abcd”;)和(const p[]=“abcd”;)這兩種情況的分析,前者字符串不能修改,后者字符串可以修改。這    是由C語(yǔ)言使用存儲(chǔ)器的方式?jīng)Q定的。

補(bǔ)充內(nèi)容

char *cards = “JQK”; 的情況下計(jì)算機(jī)操作的步驟:

計(jì)算機(jī)做的步驟:

計(jì)算機(jī)加載字符串字面值:
當(dāng)計(jì)算機(jī)把程序載入存儲(chǔ)器時(shí),會(huì)把所有常數(shù)值(如字符串常量"JQK")放到常量存儲(chǔ)區(qū),這部分存儲(chǔ)器是只讀的。

程序在棧上創(chuàng)建cards變量
棧是存儲(chǔ)器中計(jì)算機(jī)用來(lái)保存局部變量的部分,局部變量也就是位于函數(shù)內(nèi)部的變量,cards變量就在這個(gè)地方。

cards變量設(shè)為"JQK"的地址
cards變量將會(huì)保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲(chǔ)器中。

計(jì)算機(jī)試圖修改字符串
程序試圖修改cards變量指向的字符串中的內(nèi)容時(shí)就會(huì)失敗,因?yàn)樽址侵蛔x的。

char cards[] = “JQK”;的情況下計(jì)算機(jī)操作的步驟:

計(jì)算機(jī)加載字符串字面值:
當(dāng)計(jì)算機(jī)把程序載入存儲(chǔ)器時(shí),會(huì)把所有常數(shù)值(如字符串常量"JQK")放到常量存儲(chǔ)區(qū),這部分存儲(chǔ)器是只讀的。

程序在棧上新建了一個(gè)數(shù)組
我們聲明了數(shù)組,所以程序會(huì)創(chuàng)建一個(gè)足夠大的數(shù)組來(lái)保存字符串"JQK"

程序初始化數(shù)組
除了為數(shù)組分配空間,程序還會(huì)把字符串字面值"JQK"的內(nèi)容復(fù)制到棧上。

補(bǔ)充內(nèi)容

char *cards = “JQK”; 的情況下計(jì)算機(jī)操作的步驟:

計(jì)算機(jī)做的步驟:

計(jì)算機(jī)加載字符串字面值:
當(dāng)計(jì)算機(jī)把程序載入存儲(chǔ)器時(shí),會(huì)把所有常數(shù)值(如字符串常量"JQK")放到常量存儲(chǔ)區(qū),這部分存儲(chǔ)器是只讀的。

程序在棧上創(chuàng)建cards變量
棧是存儲(chǔ)器中計(jì)算機(jī)用來(lái)保存局部變量的部分,局部變量也就是位于函數(shù)內(nèi)部的變量,cards變量就在這個(gè)地方。

cards變量設(shè)為"JQK"的地址
cards變量將會(huì)保存字符串字面值"JQK"的地址。為了防止修改,字符串字面值通常保存在只讀存儲(chǔ)器中。

計(jì)算機(jī)試圖修改字符串
程序試圖修改cards變量指向的字符串中的內(nèi)容時(shí)就會(huì)失敗,因?yàn)樽址侵蛔x的。

char cards[] = “JQK”;的情況下計(jì)算機(jī)操作的步驟:

計(jì)算機(jī)加載字符串字面值:
當(dāng)計(jì)算機(jī)把程序載入存儲(chǔ)器時(shí),會(huì)把所有常數(shù)值(如字符串常量"JQK")放到常量存儲(chǔ)區(qū),這部分存儲(chǔ)器是只讀的。

程序在棧上新建了一個(gè)數(shù)組
我們聲明了數(shù)組,所以程序會(huì)創(chuàng)建一個(gè)足夠大的數(shù)組來(lái)保存字符串"JQK"

程序初始化數(shù)組
除了為數(shù)組分配空間,程序還會(huì)把字符串字面值"JQK"的內(nèi)容復(fù)制到棧上。

區(qū)別:

原來(lái)的代碼使用了指向只讀字符串字面值的指針;而在第二段代碼中,用字符串字面值初始化了一個(gè)數(shù)組,從而得到了這些字母的副本,這樣就可以隨意修改他們了。

到此這篇關(guān)于C語(yǔ)言const關(guān)鍵字的用法詳解的文章就介紹到這了,更多相關(guān)C語(yǔ)言const內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語(yǔ)言枚舉與聯(lián)合圖文梳理講解

    C語(yǔ)言枚舉與聯(lián)合圖文梳理講解

    枚舉顧名思義就是把所有的可能性列舉出來(lái),像一個(gè)星期分為七天我們就可以使用枚舉,聯(lián)合體是由關(guān)鍵字union和標(biāo)簽定義的,和枚舉是一樣的定義方式,不一樣的是,一個(gè)聯(lián)合體只有一塊內(nèi)存空間,什么意思呢,就相當(dāng)于只開辟最大的變量的內(nèi)存,其他的變量都在那個(gè)變量占據(jù)空間
    2023-01-01
  • C++深入講解哈夫曼樹

    C++深入講解哈夫曼樹

    給定N個(gè)權(quán)值作為N個(gè)葉子結(jié)點(diǎn),構(gòu)造一棵二叉樹,若該樹的帶權(quán)路徑長(zhǎng)度達(dá)到最小,稱這樣的二叉樹為最優(yōu)二叉樹,也稱為哈夫曼樹(Huffman Tree)。哈夫曼樹是帶權(quán)路徑長(zhǎng)度最短的樹,權(quán)值較大的結(jié)點(diǎn)離根較近
    2022-05-05
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列示例

    這篇文章主要為大家介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)算法基礎(chǔ)之循環(huán)隊(duì)列,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • C++實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的順序表詳解

    C++實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)的順序表詳解

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)動(dòng)態(tài)順序表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • C++ std:map的使用方法

    C++ std:map的使用方法

    std::map是C++標(biāo)準(zhǔn)庫(kù)中一個(gè)強(qiáng)大而高效的關(guān)聯(lián)容器,本文就來(lái)介紹一下C++ std:map的使用方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2025-02-02
  • VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境

    我們?cè)趙indows10中使用VS Code做C++程序開發(fā)過(guò)程中,需要安裝MSYS2和MinGW,下面這篇文章主要給大家介紹了關(guān)于VS?Code+msys2配置Windows系統(tǒng)下C/C++開發(fā)環(huán)境的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • C語(yǔ)言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)

    C語(yǔ)言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)

    這篇文章主要介紹了C語(yǔ)言中如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出

    C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出

    今天小編就為大家分享一篇關(guān)于C語(yǔ)言實(shí)現(xiàn)模擬USB對(duì)8bit數(shù)據(jù)的NRZI編碼輸出,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • 詳解C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲

    詳解C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲

    這篇文章主要為大家介紹了C語(yǔ)言實(shí)現(xiàn)猜數(shù)字游戲,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助<BR>
    2022-01-01
  • 基于C語(yǔ)言自制華容道游戲的示例代碼

    基于C語(yǔ)言自制華容道游戲的示例代碼

    這篇文章主要為大家詳細(xì)介紹了如何利用C語(yǔ)言自制華容道游戲,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-03-03

最新評(píng)論