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

深入了解C語言中的const和指針

 更新時(shí)間:2022年02月16日 11:19:02   作者:叫我小秦就好了  
這篇文章將具體為大家介紹一下C語言中const和指針的使用,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)const和指針有一定幫助,需要的可以參考一下

前言

文章內(nèi)容由閱讀《C專家編程》整理而來。希望可以幫助大家解決在指針賦值和const方面的問題,也希望大家多多指正文章中的錯(cuò)誤,共同進(jìn)步。

指針的賦值

問題

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

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

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

warning: assignment from incompatible pointer type

警告:來自不兼容指針類型的賦值

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

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

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

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

1.兩個(gè)操作數(shù)都是指向有限定符或無限定符的相容類型的指針

2. 左邊指針?biāo)赶虻念愋捅仨毦哂杏疫呏羔標(biāo)赶蝾愋偷娜肯薅ǚ?/p>

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

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

問題解決

在解決問題之前,我們先來看一組簡單的。

char* 和 const char*

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

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

注意,反過來就不能進(jìn)行賦值。

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

char** 和 const char**

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

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

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

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

const修飾

const修飾變量

首先,關(guān)鍵字const并不能把變量變成常量!在一個(gè)符號(hào)前加上const限定符只是表示這個(gè)符號(hào)不能被賦值。也就是說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,說明可以間接修改

?? ?return 0;
}

const修飾指針

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

const int* p

注:const int* p 與 int const p 寫法不同,作用是一樣的。

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

例如:

#include <stdio.h>

int main()
{
?? ?//通過下方直接解引用的方式來修改編譯器會(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;//通過這樣改變p的指向,可以間接修改*p值
?? ?printf("after:%d\n", *p);
?? ?
?? ?return 0;
}

int* const p

這種寫法的意思是:const修飾p,不能通過改變指針指向的方式修改*p的值,但可以通過解引用(*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

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

到此這篇關(guān)于深入了解C語言中的const和指針的文章就介紹到這了,更多相關(guān)C語言const 指針內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • M1 Macbook vscode C++ debug調(diào)試實(shí)現(xiàn)

    M1 Macbook vscode C++ debug調(diào)試實(shí)現(xiàn)

    本文主要介紹了M1 Macbook vscode C++ debug調(diào)試,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C++泛型算法的一些總結(jié)

    C++泛型算法的一些總結(jié)

    以下是對(duì)C++中的泛型算法進(jìn)行了總結(jié)介紹。需要的朋友可以過來參考下
    2013-08-08
  • 老生常談c++中的靜態(tài)成員

    老生常談c++中的靜態(tài)成員

    有時(shí)候需要類的一些成員與類本身相關(guān)聯(lián),而不是與類的每個(gè)對(duì)象相關(guān)聯(lián)。比如類的所有對(duì)象都要共享的變量,這個(gè)時(shí)候我們就要用到類的靜態(tài)成員,今天通過實(shí)例代碼給大家詳細(xì)介紹,需要的朋友參考下吧
    2021-07-07
  • 詳解C++賦值操作符重載

    詳解C++賦值操作符重載

    這篇文章主要介紹了C++賦值操作符重載的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • c++讀取excel的代碼詳解

    c++讀取excel的代碼詳解

    在本篇文章里小編給大家分享的是一篇關(guān)于c++讀取excel的代碼詳解內(nèi)容,需要的朋友們可以學(xué)習(xí)參考下。
    2020-02-02
  • 基于C++11的threadpool線程池(簡潔且可以帶任意多的參數(shù))

    基于C++11的threadpool線程池(簡潔且可以帶任意多的參數(shù))

    C++11 加入了線程庫,從此告別了標(biāo)準(zhǔn)庫不支持并發(fā)的歷史。然而 c++ 對(duì)于多線程的支持還是比較低級(jí),稍微高級(jí)一點(diǎn)的用法都需要自己去實(shí)現(xiàn),譬如線程池、信號(hào)量等
    2019-04-04
  • C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法

    C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法

    這篇文章主要介紹了C++操作MySQL大量數(shù)據(jù)插入效率低下的解決方法,需要的朋友可以參考下
    2014-07-07
  • C語言每日練習(xí)之動(dòng)態(tài)顯示系統(tǒng)時(shí)間

    C語言每日練習(xí)之動(dòng)態(tài)顯示系統(tǒng)時(shí)間

    這篇文章主要介紹了C語言動(dòng)態(tài)顯示系統(tǒng)時(shí),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-11-11
  • C語言實(shí)現(xiàn)注冊登錄系統(tǒng)

    C語言實(shí)現(xiàn)注冊登錄系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)注冊登錄系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法

    VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法

    這篇文章主要介紹了VC動(dòng)態(tài)生成菜單項(xiàng)的實(shí)現(xiàn)方法,在桌面應(yīng)用程序開發(fā)中常會(huì)用到的一個(gè)功能,需要的朋友可以參考下
    2014-08-08

最新評(píng)論