閱讀874 返回首頁    go 京東網上商城


[麵試題]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

  上一篇:go [Java]如何提高Web服務端並發效率的異步編程技術?
  下一篇:go node-webkit開發桌麵應用