C語言中const與指標的指標

2021-06-25 08:55:08 字數 1292 閱讀 1145

主題源自《c專家程式設計》第19頁,以下是我的理解。

先看個例子:

#include//例子1

void foo1(const char **p)

int main(void)

這個簡單的程式在編譯的時候會報個error或warning,原因是原型不匹配。

為什麼這樣?我們在像下面例子2這樣使用時明明一點問題都沒有。

#include//例子2

void foo2(const char *p)

int main(void)

這類指標賦值需要滿足下面兩個條件:

1、兩個指標必須指向相同的型別

2、左運算元指向的型別必須具有右運算元指向的型別的全部限定符

我們先來分析例子2,簡化一下就是下面這個過程

char *p1;

const char *p2;

p2=p1;

1、p1指向char型別,p2也指向char型別,他們指向的型別相同。

2、p2指向的char型別具有p1指向的char型別的全部限定符(無限定符)。

因此這個賦值是沒有問題的。

我們再來分析例子1,簡化一下就是下面這個過程

char **p3;

const char **p4;

p4=p3;

p3指向的是指向char型別的指標,p4指向的是指向const char型別的指標。

用英語可能會更清楚的描述p3和p4。

p3是pointer to pointer to char。

p4是pointer to pointer to const char。

很明顯,他們指向的型別不一樣,乙個是pointer to char,另乙個是pointer to const char。因此上面的賦值是有問題的。

有人要問了,在例子2中,p1不是賦值給了p2嗎?在例子1中作為p3和p4的一部分賦值為什麼就不行了?

這裡還有重要的一點,這種賦值是沒有傳遞性的。

我們對例子2的簡化做一下改動,

char **p3;

char *const*p4;//這裡改了

p4=p3;

p3還是pointer to pointer to char

p4則變成了pointer to const pointer to char

這時,他們都指向了相同的型別,即pointer to char。並且p4指向的型別包含p3指向的型別的全部限定符(無限定符)。因此這個賦值是沒有問題的。 

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與指標結合的理解

這裡的const要保護的就是資料不能被修改!單獨使用的話,可能就像 define一樣,但是如果是函式引數呢?指標形式的 比如我要把乙個列表裡的內容顯示出來,可能會定義這麼個函式 typedef struct list data void listshow data const data 這個時候我就...

C語言中的常量指標與指標常量

1.常量指標與指標常量是c語言中兩個比較容易混淆的概念 1 const char p 2 char const p a 3 char p abc 1 式定義了乙個常量指標,即指向乙個常量的指標,指向的內容是常量,不可修改,放在常量區的,但指標本身可以修改,即 p b 是非法的,p是p指向的常量的第乙...