最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中const和指針的秘密你知道嗎

 更新時(shí)間:2022年02月16日 15:37:57   作者:叫我小秦就好了  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言中const和指針的秘密,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助

指針的賦值

問(wèn)題

將一個(gè)類(lèi)型為 char** 的值賦值給一個(gè) const char** 類(lèi)型的對(duì)象是否合法呢?

先說(shuō)結(jié)果,在vs的環(huán)境下,編譯器不會(huì)報(bào)錯(cuò)也不會(huì)有任何警告。

但在linux環(huán)境下用gcc編譯就會(huì)出現(xiàn)下面的警告:

warning: assignment from incompatible pointer type

警告:來(lái)自不兼容指針類(lèi)型的賦值

為了代碼的可移植性我們顯然不能寫(xiě)出這樣的代碼,下面就讓我們一步步探索這其中的奧妙。

首先來(lái)了解ANSI C有關(guān)標(biāo)準(zhǔn)

ANSI C 有關(guān)簡(jiǎn)單賦值的標(biāo)準(zhǔn)

要使賦值形式合法,必須滿足下列條件之一:

  • 1.兩個(gè)操作數(shù)都是指向有限定符或無(wú)限定符的相容類(lèi)型的指針
  • 2. 左邊指針?biāo)赶虻念?lèi)型必須具有右邊指針?biāo)赶蝾?lèi)型的全部限定符

還有一個(gè)關(guān)于類(lèi)型的說(shuō)明:

const float* 類(lèi)型不是一個(gè)有限定符的類(lèi)型——它的類(lèi)型是 “指向一個(gè)具有 const 限定符的 float 類(lèi)型的指針”,也就是說(shuō) const 限定符是修飾指針?biāo)赶虻念?lèi)型,而不是指針本身。

問(wèn)題解決

在解決問(wèn)題之前,我們先來(lái)看一組簡(jiǎn)單的。

char* 和 const char*

char* 和 const char* 是匹配的。它之所以合法,是因?yàn)樵谙旅娴拇a中:

char* cp;
const char* cpp;
cpp = cp; 
  • 左操作數(shù)是一個(gè)指向有const限定符的char的指針;
  • 右操作數(shù)是一個(gè)指向沒(méi)有限定符的char的指針;
  • char類(lèi)型與char類(lèi)型是相容的,左操作數(shù)所指向的類(lèi)型具有右操作數(shù)所指向類(lèi)型的限定符(無(wú)),再加上自身的限定符(const)。

注意,反過(guò)來(lái)就不能進(jìn)行賦值。

char* cp;
const char* cpp;
cp = cpp; //此時(shí)左操作數(shù)不具有右操作數(shù)的const限定符

char** 和 const char**

由上面的知識(shí)我們可以得知,char** 和 const char** 都是沒(méi)有限定符的指針類(lèi)型,但他們的指向的類(lèi)型不一樣(前者指向char*,后者指向const char*),這違反了上面賦值標(biāo)準(zhǔn)的第一條,所以它們是不相容的。

用這種方式理解這個(gè)有一點(diǎn)困難??梢杂孟旅孢@種方法進(jìn)行理解:

char** pp1;
const char** pp2;
pp2 = pp1;
  • 左操作數(shù)的類(lèi)型是 const char**,它是一個(gè)指向 const char* 類(lèi)型的指針,而 const char* 是一個(gè)沒(méi)有限定符的指針,它指向一個(gè)帶有 const 限定的 char 類(lèi)型;
  • 右操作數(shù)的類(lèi)型是 char**,它是一個(gè)指向 char* 的指針,而 char* 是一個(gè)沒(méi)有限定符的指針,它指向一個(gè)沒(méi)有限定符的 char 類(lèi)型。

const char* 和 char* 是相容的,而且他們本身沒(méi)有限定符,所以符合標(biāo)準(zhǔn)的約束條件,兩者之間的賦值是合法的。但 const char** 和 char** 之間的關(guān)系又有不同,雖然二者都沒(méi)有限定符,但二者所指向的對(duì)象類(lèi)型不相容,所以不能進(jìn)行賦值。

const修飾

const修飾變量

首先,關(guān)鍵字const并不能把變量變成常量!在一個(gè)符號(hào)前加上const限定符只是表示這個(gè)符號(hào)不能被賦值。也就是說(shuō)const修飾的變量是只讀的,不可以被直接修改,但它不能防止被間接修改。

例如:

#include <stdio.h>

int main()
{
	const int i = 10;
	int* p = &i;
	printf("before:%d\n", i);
	*p = 20;
	printf("after:%d\n", i);//這里打印值變成了20,說(shuō)明可以間接修改

	return 0;
}

const修飾指針

const修飾指針變量有多種位置,下面我們將逐個(gè)介紹。

const int* p

注:const int* p 與 int const p 寫(xiě)法不同,作用是一樣的。
這種寫(xiě)法的意思是:const修飾p,不能通過(guò)解引用(p)的方式直接修改所指向的變量,但可以通過(guò)改變指針指向的方式來(lái)修改p。
例如:

#include <stdio.h>

int main()
{
	//通過(guò)下方直接解引用的方式來(lái)修改編譯器會(huì)直接報(bào)錯(cuò)
	//int i = 10;
	//const int* p = &i;
	//*p = 20;

	int i = 10;
	const int* p = &i;
	printf("before:%d\n", *p);
	int j = 20;
	p = &j;//通過(guò)這樣改變p的指向,可以間接修改*p值
	printf("after:%d\n", *p);
	
	return 0;
}

int* const p

這種寫(xiě)法的意思是:const修飾p,不能通過(guò)改變指針指向的方式修改*p的值,但可以通過(guò)解引用(*p)的方式直接修改所指向的變量。

例如:

#include <stdio.h>

int main()
{
	int i = 10;
	int* const p = &i;
	printf("before:%d\n", *p);
	*p = 20;//不能改變p的指向,但可以直接解引用修改值
	printf("after:%d\n", *p);

	return 0;
}

const int* const p

這種寫(xiě)法是同時(shí)修飾p和*p,既不能改變p的指向,也不能用解引用直接修改。

總結(jié)

本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!        

相關(guān)文章

  • C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明

    C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明

    這篇文章主要介紹了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-05-05
  • C語(yǔ)言小程序 如何判斷兩個(gè)日期之差

    C語(yǔ)言小程序 如何判斷兩個(gè)日期之差

    輸入兩個(gè)日期,計(jì)算之間相差多少天。 用了兩種方法實(shí)現(xiàn),第二種利用結(jié)構(gòu)體,代碼比較清晰,其余的都一樣
    2013-07-07
  • C++ 內(nèi)聯(lián)函數(shù)詳解

    C++ 內(nèi)聯(lián)函數(shù)詳解

    內(nèi)聯(lián)函數(shù)是c++為了提高程序的運(yùn)行速度做的改進(jìn),本片文章詳細(xì)介紹了C++ 的內(nèi)聯(lián)函數(shù),本文就來(lái)詳細(xì)的介紹一下,感興趣的朋友可以了解一下
    2021-11-11
  • 詳解C語(yǔ)言中的字符串?dāng)?shù)組

    詳解C語(yǔ)言中的字符串?dāng)?shù)組

    這篇文章主要介紹了C語(yǔ)言中的字符串?dāng)?shù)組,本文通過(guò)示例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-09-09
  • C++實(shí)現(xiàn)團(tuán)購(gòu)訂單管理系統(tǒng)

    C++實(shí)現(xiàn)團(tuán)購(gòu)訂單管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用C++實(shí)現(xiàn)團(tuán)購(gòu)訂單管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-12-12
  • 淺析C++中的動(dòng)態(tài)內(nèi)存分配

    淺析C++中的動(dòng)態(tài)內(nèi)存分配

    這篇文章主要為大家詳細(xì)介紹了C++中動(dòng)態(tài)內(nèi)存分配的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-03-03
  • C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法詳解

    這篇文章主要為大家詳細(xì)介紹一下C語(yǔ)言中回調(diào)函數(shù)和qsort函數(shù)的用法教程,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C語(yǔ)言有一定幫助,需要的可以參考一下
    2022-07-07
  • C++實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)

    C++實(shí)現(xiàn)校園導(dǎo)游系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)校園導(dǎo)游系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 淺談防不勝防的unsigned int的運(yùn)算

    淺談防不勝防的unsigned int的運(yùn)算

    下面小編就為大家?guī)?lái)一篇淺談防不勝防的unsigned int的運(yùn)算。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-12-12
  • C++求階乘的兩種方法

    C++求階乘的兩種方法

    這篇文章主要介紹了C++求階乘的兩種方法,有需要的朋友可以參考一下
    2013-12-12

最新評(píng)論

章丘市| 武山县| 格尔木市| 都江堰市| 固始县| 深泽县| 江安县| 牡丹江市| 乐东| 永康市| 独山县| 宽甸| 土默特左旗| 河池市| 乌鲁木齐县| 连云港市| 高州市| 安顺市| 洪雅县| 自贡市| 静宁县| 德钦县| 共和县| 湾仔区| 田阳县| 宜黄县| 包头市| 杭锦后旗| 扎兰屯市| 高阳县| 临沧市| 平顶山市| 枣庄市| 莱芜市| 仙游县| 北宁市| 葵青区| 襄城县| 郯城县| 都安| 上犹县|