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

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

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

前言

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

指針的賦值

問題

將一個類型為 char** 的值賦值給一個 const char** 類型的對象是否合法呢?

先說結果,在vs的環(huán)境下,編譯器不會報錯也不會有任何警告。

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

warning: assignment from incompatible pointer type

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

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

首先來了解ANSI C有關標準

ANSI C 有關簡單賦值的標準

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

1.兩個操作數都是指向有限定符或無限定符的相容類型的指針

2. 左邊指針所指向的類型必須具有右邊指針所指向類型的全部限定符

還有一個關于類型的說明:

const float* 類型不是一個有限定符的類型——它的類型是 “指向一個具有 const 限定符的 float 類型的指針”,也就是說 const 限定符是修飾指針所指向的類型,而不是指針本身。

問題解決

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

char* 和 const char*

char* 和 const char* 是匹配的。它之所以合法,是因為在下面的代碼中:

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

注意,反過來就不能進行賦值。

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

char** 和 const char**

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

用這種方式理解這個有一點困難??梢杂孟旅孢@種方法進行理解:

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

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

const修飾

const修飾變量

首先,關鍵字const并不能把變量變成常量!在一個符號前加上const限定符只是表示這個符號不能被賦值。也就是說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修飾指針變量有多種位置,下面我們將逐個介紹。

const int* p

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

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

例如:

#include <stdio.h>

int main()
{
?? ?//通過下方直接解引用的方式來修改編譯器會直接報錯
?? ?//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

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

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

相關文章

  • 淺析iterator與指針的區(qū)別

    淺析iterator與指針的區(qū)別

    指針和iterator都支持減法運算,指針-指針得到的是兩個指針之間的距離,迭代器-迭代器得到的是兩個迭代器之間的距離
    2013-10-10
  • c++內聯(lián)函數(inline)使用詳解

    c++內聯(lián)函數(inline)使用詳解

    這篇文章主要介紹了c++內聯(lián)函數(inline)使用詳解,需要的朋友可以參考下
    2014-04-04
  • C++ 再識類和對象

    C++ 再識類和對象

    類是創(chuàng)建對象的模板,一個類可以創(chuàng)建多個對象,每個對象都是類類型的一個變量;創(chuàng)建對象的過程也叫類的實例化。每個對象都是類的一個具體實例(Instance),擁有類的成員變量和成員函數
    2021-10-10
  • 如何在程序中判斷VS的版本(實現(xiàn)方法詳解)

    如何在程序中判斷VS的版本(實現(xiàn)方法詳解)

    下面小編就為大家?guī)硪黄绾卧诔绦蛑信袛郪S的版本(實現(xiàn)方法詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C語言菜鳥基礎教程之單精度浮點數與雙精度浮點數

    C語言菜鳥基礎教程之單精度浮點數與雙精度浮點數

    在C語言中,單精度浮點數(float)和雙精度浮點數(double)類型都是用來儲存實數的,雙精度是用記憶較多,有效數字較多,數值范圍較大。
    2017-10-10
  • C語言中的各種文件讀寫方法小結

    C語言中的各種文件讀寫方法小結

    這篇文章主要介紹了C語言中的各種文件讀寫方法小結,是C語言入門學習中的基礎知識,需要的朋友可以參考下
    2015-07-07
  • 去掉vs2010中ipch文件和.sdf文件的解決方法

    去掉vs2010中ipch文件和.sdf文件的解決方法

    本篇文章介紹了,在vs2010中產生的ipch文件和.sdf文件的解決方法。需要的朋友參考下
    2013-05-05
  • C++使用opencv處理兩張圖片的幀差

    C++使用opencv處理兩張圖片的幀差

    這篇文章主要為大家詳細介紹了C++使用opencv處理兩張圖片的幀差,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言基于EasyX實現(xiàn)貪吃蛇

    C語言基于EasyX實現(xiàn)貪吃蛇

    這篇文章主要為大家詳細介紹了C語言基于EasyX實現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-06-06
  • C++四種強制轉換原理與價值

    C++四種強制轉換原理與價值

    這篇文章主要介紹了C++的四種強制轉換原理與價值,文中介紹的非常詳細,對學習C語言有一定的參考價值,感興趣的小伙伴可以參考一下
    2023-04-04

最新評論

土默特右旗| 湘潭市| 新疆| 墨江| 开平市| 读书| 兴山县| 随州市| 东兴市| 长寿区| 平安县| 河东区| 右玉县| 广灵县| 谢通门县| 苏尼特右旗| 苍山县| 萍乡市| 高邮市| 永丰县| 榆树市| 陇川县| 万安县| 高台县| 钟山县| 昌平区| 安多县| 淄博市| 伊通| 靖边县| 微山县| 汽车| 海城市| 方城县| 若尔盖县| 信阳市| 四川省| 白沙| 健康| 喀喇| 夏邑县|