C語言中const和指標的秘密你知道嗎

2022-10-08 15:57:17 字數 1702 閱讀 9875

目錄

將乙個型別為 char** 的值賦值給乙個 const char** 型別的物件是否合法呢?

先說結果,在vs的環境下,編譯器不會報錯也不會有任何程式設計客棧警告。

但在linux環境下用gcc編譯就會出現下面的警告:

warning: assignment from incompatible pointer type

警告:來自不相容指標型別的賦值

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

首先來了解ansi c有關標準

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

還有乙個關於型別的說明:

const float* 型別不是乙個有限定符的型別——它的型別是 「指向乙個具有 const 限定符的 float 型別的指標」,也就是說 const 限定符是修飾指標所指向的型別,而不是指標本身。

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

char* 和 const char*

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

char* cp;

const char* cpp;

cpp = cp;

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

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* 和 char* 是相容的,而且他們本身沒有限定符,所以符合標準的約束條件,兩者之間的賦值是合法的。但 const char** 和 char** 之間的關係又有不同,雖然二者都沒有限定符,但二者所指向的物件型別不相容,所以不能進行賦值。

首先,關鍵字const並不能把變數變成常量!在乙個符號前加上const限定符只是表示這個符號不能被賦值。也就是說const修飾的變數是唯讀的,不可以被直接修改,但它不能防止被間接修改。

例如:#include

int main()

const修飾指標變數有多種位置,下面我們將逐個介紹。

const int* p

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

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

例如:#include

int main()

int* const p

這種寫法的意思是:const修飾p,不能通過改變指標指向的方式修改*p的值,但程式設計客棧可以通過解引用(*p)的方式直接修改所指向的變數。

例如:#include

int main()

const int* const p

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

本文標題: c語言中const和指標的秘密你知道嗎

本文位址:

C語言中const與指標的指標

主題源自 c專家程式設計 第19頁,以下是我的理解。先看個例子 include 例子1 void foo1 const char p int main void 這個簡單的程式在編譯的時候會報個error或warning,原因是原型不匹配。為什麼這樣?我們在像下面例子2這樣使用時明明一點問題都沒有。...

C語言中Const指標變數(常指標)

c語言中,指標是最難理解的一部分,尤其是const指標變數。include stdafx.h int main int argc,char argv 定義基本型別的const變數,const 位置在哪兒都可以 const int x 2,y 3 兩個常量 定義乙個非const變數 int z 3 乙...

C語言的const和指標

int const a cont int a 這兩者是等價的。代表不可以改變的常量。const修飾的是a代表a不可作為左值。1 常量指標const int b base 或者int const c base 2 指標常量int const d base1 此時要求const 在 號前面。int co...