如何理解const char p表示的是指標所指的值不變,但指標可以變?

時間 2021-05-06 10:44:34

1樓:

這個問題很好回答,也容易理解:

const 就是固定一變數裡的值,這個簡單吧!

const char *p, char *p是一指標,那const char *p就是固定一指標的值了。

const char *p 的值實際是指向內在的乙個位址, 那就是指向一片區域的起始位址。這個位置不能變了。

僅此而已,當然這個區域的內容可任意修改,這個const char *p是管不到的了。

2樓:陝北的江南

有個容易記住的辦法,const離誰近就修飾誰,1中離char近,表明const修飾指標指向的內容(char),即指標變數可改,但「abcd」記憶體不可改。2中離*近,表明const修飾指標本身,即指標變數不可被改寫,「abcd」記憶體可改。

3樓:陶鈞

這個問題其實不難理解,當你弄不明白指標和const的關係的時候,把*理解成pointer to,然後用英文反序連線起來,就好理解了

const char *,就是pointer to const char,乙個指向const char的指標。那麼說明這個指標還可指向別的,但那個char是const的,那個不能變。

char * const,就是const pointer to char,也就是說指標這個變數是const的,他只能指向某乙個固定的區域,指向的這個區域,現在被標識為char型別的

4樓:冒泡

把const和符號、變數名之外的所有東東(即型別)都去掉,看const修飾什麼

例如:const *char const **const **const *p;

去掉char,四個const分別修飾******p、*****p、***p、*p,這四個不可變,其餘的例如p、**p、****p都是可變的

5樓:張強

看const寫在哪兒把,const char * p;的const修飾char,所以是常量字元指標,字元不能修改

char * const p;的const修飾指標,所以是常量指標字元,指標不能修改

還有const char * const p;指標和字元都不能修改

const char * p="abc";一般這樣用,表示p指向的常量"abc"是不能改變的,如果你用p[0] = 'b';編譯就會出錯,而如果不用const修飾,編譯不會出錯,但執行時會出錯。

char * const p一般用於引數,表示傳遞進來的引數p不能指向其他位置,只能指向傳遞進來的引數。

6樓:王旭競

1、這事本身是乙個語法的約定問題,如果當初不是這麼約定的,換個形式,當然也成立。你可能覺得這形式不太合理,其實也不是。

2、形式一致性。

(1)、像這個語句形式可能你就很容易接受,不會產生這個疑問:const char& name2=.... 因為引用本身是不可變的,這個const的意義就很直觀。

而這與const char* p=.... 的形式是一致的。

(2)、同樣的形式約定,表現在函式上:

const char* fun

const char& fun

而且函式返回值可不可變,是函式規定的。而返回的指標本身可不可變,是函式呼叫方的區域性用途來判斷的,函式不需要管這種事。那麼最簡單直觀的形式留給最常用的情況,就很合理了。

7樓:

你可以理解為 const和volatile這類限定符修飾的是它左邊的東西。比如

char const* p表示p指向的那個char不能改變。

char* const p表示 char*也就是p本身不能改變 。

而const char* p這種奇葩可以看作是const左邊沒東西了,所以移到第乙個型別後面,相當於char const* p。換句話說,1 有等價的形式,2 沒有。

如果再加上沒有指標的情況,就是

char

constc=

const

charc;

char

*constp≠

const

char*p

;另外,如果你用模板的話,《C++ Templates》裡面提到,考慮:

typedef

char

*CharPtr

;那麼下面兩種定義是等價的,可以看成簡單的文字替換:

typedef

CharPtr

const

CharPtrConst

;// 1. 指標不能改,指向的 char 可以改

typedef

char

*const

CharPtrConst

;// 2. 等價於 1

但是如果把const寫到左邊的話,這兩種就不等價了:

typedef

const

CharPtr

CharPtrConst

;// 1. 指標不能改,指向的 char 可以改

typedef

const

char

*CharConstPtr

;// 2. 指標可以改,指向的 char 不能改

typedef

char

const

*CharConstPtr

;// 3. 等價於 2

這種情況對於引用和volatile也成立。當然引用本身都是const的,一旦初始化不能再引用其他物件,所以一般沒人寫int& const ref = ...這種宣告。

順便說一下,如果寫了,VS2015 裡面報警告,GCC 5.4 裡面報錯誤。

我個人從來不寫const char* p這種const打頭的風格。看題主個人喜好了。

8樓:Belleve

「const char *p」的意思是「『*p』的型別是『char』而且不可變」

不要用正常人類的思維思考 K&R 是怎麼設計這個語法的

9樓:

這問題有幾十年了,我從 C++ 文法的角度試著寫一下。

乙個簡單的宣告有兩部分組成: specifiers 和 declarator 。

其中 specifiers 分成兩種。一種是 type specifiers ,表明整個 declarator 返回什麼型別。例如 int , unsigned , const 。

這些 type specifiers 可以任意調換順序。例如寫 unsigned int , int unsigned , int const , const int 都是一樣的。還有一種是 non-type specifiers ,並不說明型別,而是表示宣告的名字的屬性。

例如 inline , static 這些,也可以任意調換順序。

而 declarator 就是宣告的名字以及包裹在他外面的其他一大堆符號,例如 &&&*

*const 。我們單獨拎出來一條來說。

declarator => * cv(optional) declarator

這裡的 cv 是修飾右側的 declarator 的。例如 *const volatile p 這個 cv 修飾的是 p 。這個指標宣告表示 * 後面的 cv(optional) declarator 是指向 type specifiers 的指標。

所以, const char *p 表示的是 *p ( declarator )的返回型別是 const char 。而 *p 表示 p 是指向 const char ( type specifiers )的指標。因為 type specifiers 可以任意調換順序,所以 char const *p 和 const char *p 一樣。

而 char *const p 則表示 type specifiers 是 char , const p 是指向 char 的指標。

其實只要把宣告分成兩個部分看,一切都很簡單了。

另外說說 constexpr 的事情。 constexpr 顯然是 non-type specifier ,表明名字的屬性,不表示型別。 constexpr 不可以放在 declarator 一側,指標只可以被 cv 修飾。

constexpr int *p 中的 constexpr 和 static 或者 inline 一樣,表示 p 的屬性。而因為 constexpr 蘊含了 const ,所以 p 是 const 指標,指向 int 。

10樓:坐下坐下基本操作

pointer to 'const char'

'const pointer' to char

這樣是不是就很好理解了?

11樓:Kelvin

倒著讀,號讀成pointer

所以就是 p is a pointer of const char第二個就是

p is a const pointer of char

12樓:pansz

*號是個分界線,左邊是指向的值,右邊是指標本身。

所以const在*號左邊表示指標指向的值為常量。

const在*號右邊表示指標自身為常量。

這樣理解就可以了。

第一張圖可以 p="cdef" 因為字串常量就是const char 型別。

第二張圖則應有編譯錯誤,把警告開啟會告訴你錯在哪。

13樓:劉暢

這個其實是C++的乙個syntax sugar,但是就比較容易讓初學者誤解。這個syntax sugar就是const T的標準定義為T const。所以const char * 的標準寫法為

char const *

怎麼解讀呢?它的意思本質上是乙個T *,其中T=char const。用中文講,就是指向這個類似T的指標。

其中T為char const,意思就是這個指標變數的值是可以隨意變的,但是指標變數對應位址內的值為「不可變字元」型別(char const)。

所以當你寫

const char* p="abcd「;

p可以隨意改變,但是*p (指標p對應位址內的值)不可以。因此

p = "efgh";

是合法的,因為"efgh「本身為char const*。而

*p = 'e';

非法,因為*p不可變。

而char * const也可以類似理解。它本質就是U const, with U=char*。這裡const修飾這個變數本身是個不可變的。

而這個變數的型別為「指向字元的指標「。所以你可以寫

char * const p = "abcd";

*p = 'e'; (合法)

但是當你寫

p = "efgh「; (非法)

因為這時你在試圖改變乙個const variable (p)的值,使其存處乙個其它位址。

相對來說完整的型別可為

char [const] [* [const]] [&]

其中每個為可以選擇的修飾,按順序分別表示char內容不可變,指標,指標不可變,引用。

其中,作為C++ syntax sugar的一部分,第乙個const可以提前。

動詞 修飾體言 不表過去,表狀態 到底該如何理解?

花瓣 首先 使 練習 肯定是不正確的。表示動作正在進行,總不能是 正在使用排球的練習 吧。另外,使 使 都是可以用的,就單純表示 使用排球來練習 使 練習 一般只用在客觀描述句裡。這裡有乙個微妙的語感,這句是客觀的將 使 練習 作為乙個整體,跟動畫前期描述的 使 練習 做對比的。妹子說這話時,強調的...

這個群表的條件怎麼理解?

群表的存在性和群的封閉性等價,單位元的存在由題幹保證,逆元的存在與條件 1 等價,這個題主似乎都清楚,也明白如何利用結合律 比如消去中間元素 得到條件 2 只需要利用條件 2 構造合適的矩形證明結合律,就圓滿了。具體來說,不妨設群表的第一行 列的第一 二 三個元素分別為 表中元素為行對應的元素乘以列...

如何去理解阿巴斯的電影,比如《櫻桃的滋味》想表達什麼?

維尼 櫻桃的滋味這部電影我是從後半部開始看的,因為我很久不開電視機了,當開啟的時候正好在放 櫻桃的滋味 這部電影。當時已經是男主角和那個搞解剖的老頭在車裡對話。我很快就接受了土耳其老者說的人生哲理,同時被伊朗的景色所吸引了。我很佩服電影的攝影,取景的意境深遠,令人遐想,同時充滿了對於生活的熱愛。美麗...