问题

C/C++ 里指针声明为什么通常不写成 int* ptr 而通常写成 int *ptr ?

回答
在 C/C++ 中,指针声明的写法确实存在两种常见的形式:`int ptr;` 和 `int ptr;`。虽然它们最终都声明了一个指向 `int` 类型的指针变量 `ptr`,但它们在语法上的侧重点和历史演变上有所不同,导致了后者(`int ptr;`)更为普遍和被推荐。

下面我将详细解释为什么通常写成 `int ptr;`,并深入探讨其背后的原因:

理解 C/C++ 的声明语法

要理解这一点,首先需要了解 C/C++ 的声明语法是如何工作的。C/C++ 的声明语法有一个核心原则:声明的语法应该反映变量的实际使用方式。

让我们看一个简单的变量声明:
`int x;`
这声明了一个名为 `x` 的变量,它的类型是 `int`。当我们使用 `x` 时,我们直接使用 `x`,它代表一个整数值。

现在,我们来看指针声明。指针变量本身存储的是一个内存地址。要获取地址中的值,我们需要使用解引用操作符 ``。

剖析 `int ptr;`

让我们把 `int ptr;` 分解开来:

1. `int`: 这指定了指针指向的数据类型。也就是说,它告诉你这个指针可以指向一个 `int` 类型的值。
2. ``: 这个星号是类型修饰符,它表明 `ptr` 本身是一个指针。
3. `ptr`: 这是变量的名称。

将它们结合起来,`int ptr;` 的字面意思是:“`ptr` 是一个指向 `int` 的指针。”
当我们写 `ptr` 时,我们是在解引用 `ptr`,获取它所指向的那个 `int` 值。
这与声明的语法 `int ptr;` 是完全匹配的:声明 `int ptr;` 表明 `ptr` 是一个 `int ` 类型,而 `ptr` 就是这个 `int ` 类型通过解引用得到的 `int` 类型。

核心:`` 紧随变量名,强调的是变量 `ptr` 本身是一个指针。

剖析 `int ptr;`

现在看 `int ptr;`:

1. `int`: 这将 `int` 和 `` 捆绑在一起,形成一个复合类型,名为“指向 `int` 的指针类型”。
2. `ptr`: 这是变量的名称。

这样声明的字面意思是:“`ptr` 是一个 `int` 类型变量。”
当我们写 `ptr` 时,我们是在解引用 `ptr`。

核心:`` 紧随类型 `int`,强调的是 `int` 本身被“指针化”了。

为什么 `int ptr;` 更受青睐?

虽然两种写法都有效且最终结果一样,但 `int ptr;` 在以下几个方面更具优势,也因此成为更普遍的写法:

1. 更准确地反映了 C/C++ 的声明语法原则

如前所述,C/C++ 的声明语法遵循“声明即使用”的原则。
`int ptr;` —— `ptr` 是一个变量,它的声明方式是 `ptr`。而 `ptr` 的类型是什么?是 `int`。所以 `ptr` 本身是 `int` 类型。
`int ptr;` —— `ptr` 的类型是 `int`。

从这个角度看,`int ptr;` 更能体现“`ptr` 是一个指针”这一本质。它表明 `ptr` 本身是一个指针,它指向的东西才是 `int`。

2. 在声明多个指针时避免混淆

这是 `int ptr;` 写法最重要的优势。
考虑以下声明:

```c++
int p1, p2; // 使用 int ptr; 的风格
```

根据 C/C++ 的语法规则,声明中的修饰符(如 ``)是应用于紧跟其后的变量名的。

`p1`: 这个部分声明 `p1` 是一个指向 `int` 的指针。
`p2`: 这个部分仅仅声明 `p2` 是一个 `int` 类型的变量,不是指针。

所以,上面的代码声明了一个指向 `int` 的指针 `p1` 和一个普通的 `int` 变量 `p2`。

现在,如果我们试图用 `int` 的风格声明多个指针:

```c++
int p1, p2; // 使用 int ptr; 的风格
```

这个声明会被解释为:

`int p1`: 声明 `p1` 是一个指向 `int` 的指针。
`p2`: 这个部分仅仅是一个独立的标识符,它并没有继承 `int` 的类型修饰符。因此,它会被解释为一个普通的 `int` 变量。

问题就在这里: 当你想要声明两个(或更多)指针时,比如 `int p1, p2;`,你必须在每个想要声明为指针的变量名前都加上 ``。

如果我们继续使用 `int` 的风格,想声明两个指针:

```c++
int ptr1, ptr2;
```

很多人会误以为这是声明了两个 `int` 指针,但实际结果是:
`ptr1` 是 `int` 类型(指向 `int` 的指针)。
`ptr2` 是 `int` 类型(普通的整数)。

为了声明两个 `int` 指针,必须写成:

```c++
int ptr1, ptr2;
```

这使得代码容易出错,尤其是在声明多个指针变量时。每一次都必须记住在变量名前加上 ``。

相比之下,使用 `int ptr1, ptr2;` 的风格,当你需要声明多个指针时,只需要在每个变量名前加上 ``:

```c++
int p1, p2, p3; // 清晰地声明了 p1, p2, p3 都是指向 int 的指针
```

这种写法非常直观,因为 `` 紧跟着变量名,明确表明了该变量是一个指针。

3. 历史原因和社区习惯

C 语言的设计者 Dennis Ritchie 在编写 C 语言时,倾向于将 `` 与变量名关联,以体现“声明即使用”的哲学。这种风格在 C 语言的早期就形成了,并且被广泛接受和使用。
随着 C++ 的发展,也继承了 C 的大部分语法规则,包括指针声明的习惯。因此,`int ptr;` 风格是历史悠久且在绝大多数 C/C++ 代码库中都可以看到的标准写法。

4. IDE 和编译器的支持

无论是哪种写法,现代的编译器和 IDE 都能正确解析。但是,代码的可读性和避免潜在错误是更重要的考量。

总结

简而言之,`int ptr;` 被普遍推荐和使用,主要是因为它:

更准确地遵循了 C/C++ 的声明语法原则:“声明的语法应该反映变量的实际使用方式”。 `ptr` 是解引用操作,产生一个 `int`,所以 `ptr` 本身是 `int`。
在声明多个指针时,能清晰地表达意图并避免因语法疏忽导致的错误。 `int p1, p2;` 比 `int p1, p2;` (后者错误地声明了 `p2` 为 `int`) 或 `int p1, p2;` (后者虽然正确但不如前者直观) 更不容易出错。
是社区长期的编程习惯和历史沿袭。

虽然 `int ptr;` 在概念上将 `int` 视为一个完整的类型(例如,可以写 `typedef int IntPtr;`),但它的写法在声明多个指针时容易产生混淆。因此,为了代码的清晰、健壮和易维护,`int ptr;` 是更受推崇的风格。

最终的选择是个人或团队的编码风格问题,但理解 `int ptr;` 的背后原因有助于写出更规范和易于理解的代码。

网友意见

user avatar
       int  *p = 0; // 声明 if (*p) ... // 使用     

那么既然你使用的时候,*和p 是连在一起的,那么声明的时候也应该在一起,保持一致,这样搜索代码的时候,搜索 "*p",可以找到所有的声明和引用。

user avatar

“*”被称为所谓的“解引用/去关联”de-reference 操作符(在使用指针时)。

它对一个指针进行操作,并给出存储在该指针中的值。

您爱怎么写, 只要编译不出错, 就是对的。


但是, 在现实生活中, 您需要顾及别人的感受。也就是说, 您所在的环境别人习惯了怎么写, 您就顺从好了。

这本身不是什么 JB 问题。(JB = 基本)


///////////////////////////////////////////////////////////////////////


       #include <stdio.h> int main() {     long double* ptr_ld_var, ld_var;     ld_var = 5.00001000020000300004000050000600007;     //ld_var = 5.00001000020000300004000050000600007f;      ptr_ld_var = &ld_var;     printf("%32.30Lf
", *ptr_ld_var);   // Check the Output     return 0; }     


       5.000010000200003190684583387338 [wenxue@hpi7 hellvsc]$     


练习中 ld_var 的地址被分配给 ptr_ld_var 指针。为了得到该地址中存储的值,使用*ptr_ld_var。

备注:在例子中,ptr_ld_var是一个指针,而不是 “ *ptr_ld_var”。

您不能也不应该做类似 *ptr_ld_var = &ld_var 的骚操作。


类似的话题

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有