2016-07-08 65 views
3

我在面試中遇到過這樣的問題。 此代碼似乎很簡單:奇怪的c指針問題

long a = 1234; 
    long &b = a; 

對於我來說,A和B是相同的東西。 但我問其中4以下的表達是同樣的事情

const *long c = &a; 
    const long *d = &a; 
    const * long e = &a; 
    long *const f = &a; 

老實說,我不明白其中的4是等價的。

+2

兩個指針定義無效。因爲它們都是錯誤的,所以( –

+0

(1)和(3)是相同的東西:) :) –

+2

它們都不是'同一件事',但第四種選擇是創建一個指針,指向'a'的地址,因爲它是一個常量指針,它不能改變指向任何其他地址,所以我猜這是一樣的東西,即使獲得值,你將不得不解除引用'f',而你不必這樣做'b'。 – LordWilmore

回答

4

這裏的事情是,引用不能被分配指向一旦初始化的另一個對象。所以最接近指針的類比將是一個指向非常量對象的常量指針。因此,你只需要找到相匹配的表達式:

const *long c = &a; // invalid syntax 
const long *d = &a; // non-const pointer to const long 
const * long e = &a; // invalid syntax 
long *const f = &a; // const pointer to no-const long 
1
  1. 語法無效。
  2. 指向常量對象的指針。指針地址可以改變,數據不能。
  3. 語法無效。
  4. 最後一個是一個指向非常量對象的常量指針。就像對非const的引用一樣。
0

讓我們來看看這些代碼:

long a = 1234; // you declare variable and initialize with 1234 value 
    long &b = a; // you declare another variable that points to the same address as a 

在這種情況下,如果你同時打印,你會看到兩個具有相同的地址和值:

a = 555; 
    printf("%d, %d, %d, %d\n", a, &a, b, &b); \\ a and b are 555 

但你不能改變地址b(也是)。考慮到所有上述因素,你可以假設第四個選項是正確的答案,因爲你也不能改變這個指針的地址。

long *const f = &a; 
0

我認爲你們所有人忘記提及C聲明的原則:除非它被括號包圍,否則你應該從右到左閱讀它。

const *long c // c is a long of const pointer, wtf? 
const long * d // d is a pointer to a const long, good 
const * long e // space doesn't matter in C 
long * const f // f is a const pointer to long, good