c - [] 和 * 的位置

标签 c pointers

我在创建指针时总是这样放置星号:

//directly adjacent to the type
int* p = new int();

所以我不会将声明与取消引用混淆。但后来我了解到:

//p is a pointer, q is an int
int* p, q;

这误导了我,所以我开始将星号放在变量旁边,而不是类型旁边。然而,这让我开始思考。他们为什么要这样设计?以这种方式思考它可能很糟糕,但我一直认为指针是类型的一部分。就像,它不是指向 int 的指针,它是一个 int 指针。我知道它实际上不是那样的,但它在我脑海中总是流动得更好。真正让我思考的是,为什么要加上括号:

//after the variable
int p[1];

tldr;为什么星号在变量前面,括号在后面

最佳答案

声明的 C 语法使用“向我们展示您将如何使用某物并告诉我们它是什么类型”的模型。

因此,如果 x 是一个 int,我们从 x 开始,然后说它是一个 int : int x;.

如果 x 是指向 int 的指针,那么我们将使用 *x 来获取 int ,所以我们说 int *x;

如果 x 是一个返回 int 的函数,那么我们可以将它用作 x() 来获取 int ,所以我们说这是一个 int:int x();

使用此模型的一个原因是它主要使用您已经为表达式构建的语法:声明的主体以与表达式相同的方式进行解析,然后您只需添加类型。如果您不使用相同的模型,那么您必须发明更多的语法来声明类型。

此模型使诸如 int *x, y; 的声明非常清楚:*xy 的类型都是 int

关于c - [] 和 * 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21176221/

相关文章:

c - 如何检查 __builtin_ 函数在 gcc 上是否可用

检查下一行

c++ - 如何初始化不同对象指针的 vector ?

c - 当尝试解压缩用字典压缩的原始 deflate 数据时,什么时候调用 inflateSetDictionary() 有效?

c - C/C++中sqrt函数的保证精度

将内联函数转换为宏

c - 使用头文件修复 GCC 中的编译器错误

更改结构模块指针

c++ - 减法指针

c - 如何将部分字符串读入较小的字符串