日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言const關鍵字的用法詳解_C 語言

作者:Love?coldplay ? 更新時間: 2022-10-15 編程語言

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 = &num;
	*p= 20;
	printf("%d\n", num);

運行結果

通過上圖我們發現num的值被修改了,通過指針可以間接的修改const修飾的變量。

但是運行時會出現警告:warning C4090: “初始化”: 不同的“const”限定符。

是因為num類型是const修飾,但是p是整型指針變量 ,

類型不同。所以通過下面強轉就沒警告了。

改進后的代碼

    const int num = 100;
	int *p = (int*)&num;
	*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

欄目分類
最近更新