874
京東網上商城
[麵試題]const與指針
(1)const int *p; int const *p2;
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main(){ int a = 3; int b = 4; const int *p; p= &a; int const *p2; p2 = &b; //*p = 5; error: assignment of read-only location '* p' //*p2 = 5; error: assignment of read-only location '* p2' p = &b; printf("%d\n",*p); //綜上可以知道:指針不是常量,指針所指向的內存區域是常量。 }
*p = 5;
報錯:error: assignment of read-only location '* p'
*p2 = 5 ;
報錯:error: assignment of read-only location '* p2'
意思很明確:*p *p2都是常量不可以更改。指針p和p2都是變量可以隨意指向任意地址。p = &a; p = &c;都可以。
(2)int *const p3
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main(){ int a = 3; int b = 4; //int *const p3 error:uninitialized const 'p3' 隻能在聲明的時候就給它賦初值,否則還是會報錯的 int *const p3 = &a; //p3 = &b; error: assignment of read-only variable 'p3' *p3 = 8; printf("%d\n",*p3); //綜上可以知道:指針是常量,所指向的內存區域是不能更改的。指針所指向的內存區域不是常量,可以修改。 }
int *const p3;
報錯:error:uninitialized const 'p3' 沒有對p3進行初始化。
p3 = &b;
報錯:error: assignment of read-only variable 'p3' 指針p3是常量,不可以更改指針指向的地址。
*p3 = 8;
*p3是變量,可以更改指針p3指向的值。
綜上可以知道:指針p3是常量,不可以更改指針指向的地址。*p3是變量,即指針指向的是變量,可以更改指針p3指向的值。
(3)const int *const p3
#include <iostream> #include <stdio.h> #include <string.h> using namespace std; int main(){ int a = 3; int b = 4; const int *const p3 = &a; //int *const p3 error:uninitialized const 'p3' //p3 = &b; error: assignment of read-only variable 'p3' //*p3 = 8; error: assignment of read-only location '*(const int*)p3' printf("%d\n",*p3); }
int *const p3;
報錯:error:uninitialized const 'p3' 沒有對p3進行初始化。
p3 = &b;
報錯:error: assignment of read-only variable 'p3' 指針p3是常量,不可以更改指針指向的地址。
*p3 = 8;
報錯:error: assignment of read-only location '* (const int*)p' *p3是常量,不可以更改指針p3指向的值。
綜上可以知道:指針p3是常量,不可以更改指針指向的地址。*p3是常量,即指針指向的是常量,不可以更改指針p3指向的值。
具體總結:
int* p = 4; //non-const pointer,non-constdata const char* p = &p; //non-constpointer,const data; char* const p = &p;//constpointer,non-const data; const char* const p = &p; //constpointer,const data;
關於定義的閱讀,一直以為這段解釋很不錯了已經,即以*和const的相對位置來判斷:
const語法雖然變化多端,但並不莫測高深。如果關鍵字const出現在*左邊,表示被指物是常量;如果出現在*右邊,表示指針自身是常量;如果出現在*兩邊,表示被指物和指針兩者都是常量。
如果被指物是常量,有些程序員會將關鍵字const寫在類型之前,有些人會把它寫在類型之後、*之前。兩種寫法的意義相同,所以下列兩個定義相同:
const Widget* w; Widget const* w;
其實很簡單,const和*的優先級相同
且是從右相左讀的,即“右左法則”
其實const隻是限定某個地址存儲的內容不可修改
比如int*p;讀作p為指針,指向int,所以p為指向int的指針
int*const p;讀作p為常量,是指針,指向int,所以p為指向int的常量指針, p不可修改
int const *p;p為指針,指向常量,為int,所以p為指向int常量的指針, *p不可修改
int ** const p; p為常量,指向指針,指針指向int,所以p為指向int型指針的常量指針,p不可修改
int const**p; p為指針,指向指針,指針指向常量int,所以p為指針,指向一個指向int常量的指針, **p為int,不可修改
int * const *p ; p為指針,指向常量,該常量為指針,指向int,所以p為指針,指向一個常量指針,*p為指針,不可修改
int ** const *p; p為指針,指向常量,常量為指向指針的指針,p為指針,指向常量型指針的指針,*p為指向指針的指針,不可修改
int * const **p; p為指針,指向一個指針1,指針1指向一個常量,常量為指向int的指針,即p為指針,指向一個指向常量指針的指針, **p為指向一個int的指針,不可修改
最後更新:2017-04-03 05:40:17