C 指標搞混淆了

2022-07-23 21:30:25 字數 3894 閱讀 3212

1樓:匿名使用者

(3)中的寫法有誤。

先說單獨定義一個字元指標是這樣的:

char *p;

const是型別限定符(type-qualifier),constant的縮寫,用於型別宣告限定。

就像在中說的:

「簡單的記,const的屬性賦予點是在其最近的識別符號或型別上,僅僅作用在一個點上面。這句話細想不是很嚴謹,但是一般這樣用沒錯。」

上面一句話也就是說,const離char近,作用點就在char上;離p近就作用在p上。

const char *p; p是一個指向常字元的指標(const離char近)。

char const *p; 這個和上一個意義一樣(const離char近)。

char *const p = "helloworld!"; p是一個指向字元的常指標(const離p近),必須在定義時候同時初始化,因為p常指標,一旦定義以後就不能改變指向了。

還有一種常見的用法是:

const char *const p = "helloworld!";這個是指向常字元的常指標(char和p都有const限定),也是必須在宣告時候同時初始化,理由同上。

注意:char *p const;這個定義是不對的。

這些其實沒什麼可以理解的,就像2+3=5一樣直接記住就可以了,以後隨著學的深入再加深理解。

至於你說的其它寫法,還有的,但是意義只是上面幾種。

像這樣的寫法:

const const const const char const const *const const const p = "helloworld!";

這樣的寫法也對,但是意義和const char *const p = "helloworld!";

2樓:魔法師00可可

char * const p; //常量指標,p的值不可以修改char const * p;//指向常量的指標,指向的常量值不可以改

const char *p; //和char const *pconst* char p; //和char * const p這裡刻意打亂了樓主題中的順序,不知道樓主看了是否頭暈其實,識別這個並不困難,就拿const* char p來說const修飾的是什麼呢,是個 * 號對吧》* 號指什麼呢》指標》所以答案就很明確了,這個指標裡存放的地址是不可改變的(const修飾)。但是指標所指向的字元單元卻沒有被const修飾,所以是可變的。

再舉個例子,char const *p,這裡const修飾*p》*p是個值》所以*p這

個值是不能改變的,但是p卻沒有被const修飾,p是可變的

3樓:

你的(3)有誤吧,我沒有見過,這個不太清楚。

(1)指標p所指向的內容不可變。

(2)指標p不可變,但是其指向的內容可變。

(4)等同於(1)

4樓:匿名使用者

(1)是指標的指向的地址值可以改變,但是所指向的地址的內容是不可以改變的,(2)(3)都是一樣的,只是寫法不同,剛好和(1)的相反,指標所指向的地址值不能改變,但是所指向的地址的內容是允許改變的,(4)和(1)一樣,只是寫法不一樣!

5樓:

樓上有兩位大哥不要誤導別人,(3)const* char p;【錯誤的寫法】

辛苦打了大半天,希望你能理解,確實挺繞人的,不過理解後就豁然開朗了

1、const char *p; 【指向const物件的指標】

【幫助理解】:p是指向常量的指標,指向的常量值不可以改。

指標指向const物件,不允許用指標來改變其所指的const值。

此例中,const限定了p指標所指向的物件型別,而並非p本身,也就是說,p本身不是const。

允許給p重新賦值,使其指向另一個const物件,但不能通過p修改其所指物件的值。

const char *p;

const char c = '0';

*p ='0'; //錯誤

p = &c; //正確

還一種情況,當const物件的指標 指向非const物件時:

const char *p;

char c = '0';

p = &c; //正確

是允許的,但同樣不允許通過指標p來修改c的值。

2、char *const p; 【const指標】

【幫助理解】:p是常量指標,p的值不可以修改。

與其他const變數一樣,const指標本身的值不能修改。

此例中,const限定了p指標本身,也就是說,不允許給p重新賦值。必須在定義時初始化。但使用p指標修改它所指向物件的值。

char cc = '0';

char *const p=&cc;

char c = '0';

*p ='0'; //正確

p = &c; //錯誤

貌似和上面第一例相反,呵呵,這樣有助於理解、記憶。其實區別這兩種很簡單,就是確定const限定p指標所指向的物件,還是限定的是p指標本身。

4、char const *p; 【指向const物件的指標】

【幫助理解】:const限定符既可以放在型別前面,也可以放在型別後面。

char const c;

const char c;

等價的。同理

(1)const char *p;

(4)char const *p;

等價的。

5、還有一種 const char *const p ;【指向const物件的const指標】

const char c = '0';

const char *const p = &c;

本例中,既不能修改p所指向物件的值,也不能修改該指標的指向(即p中存放的地址值)。

【幫助理解】:從右至左,p首先是一個const指標(不能修改p本身,即p的地址),指向char型別的const物件(不能修改p所指向的值,即char型別的const物件)。

6樓:匿名使用者

char * p p 為指標變數名, p中儲存的內容(地址1) 指向另一個地址2,裡面存放一個字元

const char *p const修飾的是char表示字元不可改變 即地址2內容不可改;

char const*p const修飾的是p表示p指向的地址不可改變 即地址1內容不可改,但地址2中的內容可以改,既相應的字元可以改

char const*p== char *constpconst* char p沒見過

還有一個

const char const* p 就是都不可改變

7樓:

對指標來說,可以指定指標本身為const,也可以指定指標所指的資料為const,或二者同時指定為const,還有,兩者都不指定為const。

(1)是指定指標所指的資料為const,指標所指向資料是不可修改的,這個指標變數p本身不是const的,它可以再指向其他資料,可以重新給他賦值。

(2)是指標變數本身是const的,初始它指向一個字元型的資料,以後它就一直指向這個字元資料,不可以再改變了,即不能重新給他賦值讓它再指向別的值了。

(3)沒見過這種用法

(4)c++裡面沒有const*的運算子,c++標準規定,const關鍵字放在型別或變數名之前等價的,所以這個跟(1)是一樣的。

(5)還可以是const char * const p,即指標和它指向的部分都是const型的。

(6)當讓也可以都不是const型的,char *p,這個就普通的指標了。

我是這麼記的,看const的位置,以*作分界線,比如(1),const的位置在*前面和char結合(同樣(4)也是這種情況),表示指向的資料是常型的,而(2),const在*後面,與p結合,表示指標變數本身是const型的,其他的類似。

c語言指標問題,C語言指標問題

記憶體對齊的緣故。p buf 作為一個指標,它的值是記憶體的某個位元組的地址。如果想要把 p buf 強制轉換版 成一個 unsigned int 型別的指權針,需要滿足一個必要條件,就是 p buf 的值必須能夠被4整除。之所以是4,是因為 unsigned int 是要佔4個位元組的 c語言結構...

C語言指標變數比較,怎樣運用c語言指標變數比較兩個字串是否相等?請修改

首先要 分清,是在 宣告中 還是在語句中。宣告中,例如 int a 1,b 2 int p,q 宣告 p 和 q 是指標,用於指向 int 型資料。p a q b 語句,p 和 q 是指標 指向的資料 的地址,p 指向 a,q 指向 b.if p q printf 語句,p 和 q 是 地址 地址大...

c 指標陣列問題,C 中關於指標陣列的問題。

是錯誤的。char cchar count 宣告瞭cchar是有count個元素的陣列,每個元素都是指向char型變數的指標。但cin cchar i 卻試圖給cchar的第二個元素 指標 賦一個鍵盤值 這裡指標還沒有確定指向,是隨機的,它隨機地指向了不能寫入的地方,就要出錯。這裡應該先給指標陣列賦...