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 構造合適的矩形證明結合律,就圓滿了。具體來說,不妨設群表的第一行 列的第一 二 三個元素分別為 表中元素為行對應的元素乘以列...
如何去理解阿巴斯的電影,比如《櫻桃的滋味》想表達什麼?
維尼 櫻桃的滋味這部電影我是從後半部開始看的,因為我很久不開電視機了,當開啟的時候正好在放 櫻桃的滋味 這部電影。當時已經是男主角和那個搞解剖的老頭在車裡對話。我很快就接受了土耳其老者說的人生哲理,同時被伊朗的景色所吸引了。我很佩服電影的攝影,取景的意境深遠,令人遐想,同時充滿了對於生活的熱愛。美麗...