奇怪的 c 指针问题

Strange c pointer issue

本文关键字:指针 问题      更新时间:2023-10-16

我在求职面试中遇到了这种问题。这段代码似乎非常简单:

  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 中哪一个是等价的。

这里的问题是,一旦初始化,就不能将引用分配给指向另一个对象。因此,与指针最接近的类比是指向非常量对象的常量指针。因此,您只需要找到一个匹配的表达式:

const *long c = &a; // invalid
const long *d = &a; // non-const pointer to const long
const * long e = &a; // invalid
long *const f = &a; // const pointer to non-const long
  1. 语法无效。
  2. 指向常量对象的指针。指针地址可以更改,数据不能更改。
  3. 语法无效。
  4. 最后一个是指向非常量对象的常量指针。就像对非常量引用一样。

让我们检查一下代码:

  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, %dn", 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