在指针声明中放置星号

新手上路,请多包涵

我最近决定我只需要最终学习 C/C++,关于指针,或者更准确地说,它们的定义,我并不真正了解一件事。

这些例子怎么样:

  1. int* test;
  2. int *test;
  3. int * test;
  4. int* test,test2;
  5. int *test,test2;
  6. int * test,test2;

现在,据我了解,前三种情况都在做同样的事情:Test 不是一个 int,而是一个指向 int 的指针。

第二组示例有点棘手。在案例 4 中,test 和 test2 都是指向 int 的指针,而在案例 5 中,只有 test 是指针,而 test2 是“真正的”int。案例6呢?和案例5一样吗?

原文由 Michael Stum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 491
2 个回答

4、5、6是同一个东西,只是 test 是一个指针。如果你想要两个指针,你应该使用:

 int *test, *test2;

或者,甚至更好(让一切都清楚):

 int* test;
int* test2;

原文由 Milan Babuškov 发布,翻译遵循 CC BY-SA 2.5 许可协议

我一直喜欢这样声明指针:

 int* i;

我读到这篇文章是为了说“ i 是 int-pointer 类型的”。如果每次声明只声明一个变量,则可以摆脱这种解释。

然而,这是一个令人不安的事实,这种解读是 错误 的。 C 编程语言,第 2 版。 (第 94 页)解释了相反的范式,即 C 标准中使用的范式:

指针 ip 的声明,

>  int *ip;
>
> ```
>
> 旨在作为助记符;它说表达式 `*ip` 是 `int` 。变量声明的语法模仿变量可能出现的表达式的语法。这种推理也适用于函数声明。例如,
>
> ```
>  double *dp, atof(char *);
>
> ```
>
> says that in an expression `*dp` and `atof(s)` have values of type `double` , and that the argument of `atof` is a pointer to `char` 。

所以,根据 C 语言的推理,当你声明

int* test, test2;


您没有声明 `int*` 类型的两个变量,而是引入了两个计算结果为 `int` 类型的表达式,没有附加到 `int` 的分配记忆。

编译器非常乐意接受以下内容:

int *ip, i; i = *ip;

”`

因为在 C 范式中,编译器只需要跟踪 *ipi 的 _类型_。程序员应该跟踪 *ipi 的 _含义_。在这种情况下, ip 未初始化,因此程序员有责任在取消引用之前将其指向有意义的内容。

原文由 TallChuck 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题