奇怪的c指针问题

问题描述:

我在面试中遇到过这样的问题。 此代码似乎很简单:奇怪的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

这里的事情是,引用不能被分配指向一旦初始化的另一个对象。所以最接近指针的类比将是一个指向非常量对象的常量指针。因此,你只需要找到相匹配的表达式:

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. 语法无效。
  2. 指向常量对象的指针。指针地址可以改变,数据不能。
  3. 语法无效。
  4. 最后一个是一个指向非常量对象的常量指针。就像对非const的引用一样。

让我们来看看这些代码:

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; 

我认为你们所有人忘记提及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