C++中关于int *p和 int* p的区别?

本文解析了C++中指针变量的不同声明方式及其可能导致的误解,并介绍了如何更清晰地声明指针变量。

根据C++Primer介绍:

对于int* p(这种写法合法,但是容易造成误导),其基本数据类型是int,后面的*其实是声明符。在一组公用的数据类型后面可以使用不同的声明符。例如: int i =1024, *p = &i, &r = i;    //i是一个int类型的数据,p是一个int型的指针,r是一个int型引用。

对于int *p,其和int* p 的含义一样,都表示int类型的指针变量p。

但是将声明符紧跟着变量名是一种更容易理解的做法。否则可能会出现误导现象:

例如 int* p1, p2;表示含义是p1是一个int型的指针,p2是一个int型变量。而不是p1,p2都是指针变量,它们共用的是基本数据类型部分。

如果写成int *p1,p2;则和上式表示的含义完全一样,但是更加清晰,不会造成误导。

不过对于以上两种写法的使用,主要看个人的习惯,但是最好不要混用。

<think>在C++中,`int* p``int *p`在语法上是完全等价的,没有实际区别。它们都声明了一个指向整数的指针变量`p`。空格在C++的类型声明中被忽略,因此这两种写法在编译器看来是相同的。 ### 关键点: 1. **声明风格**: - `int* p`:强调类型(`int*`是指向整型的指针类型)。 - `int *p`:强调变量(`*p`是一个整数,所以`p`是指向整数的指针)。 2. **多个变量声明时的差异**: 当声明多个指针变量时,两种风格可能导致不同的理解: ```cpp int* p1, p2; // p1是指针,p2是普通int(容易误解) int *p3, *p4; // 两个都是指针(明确) ``` ### 代码示例: ```cpp #include <iostream> using namespace std; int main() { int a = 10; int b = 20; // 两种声明方式 int* ptr1 = &a; // 风格1: 将*靠近类型 int *ptr2 = &b; // 风格2: 将*靠近变量名 // 使用上完全相同 cout << "a: " << a << " *ptr1: " << *ptr1 << endl; cout << "b: " << b << " *ptr2: " << *ptr2 << endl; // 修改值 *ptr1 = 100; *ptr2 = 200; cout << "修改后 a: " << a << " b: " << b << endl; // 多个变量声明示例 int* p3 = &a, p4 = b; // p3是指针,p4是int(不是指针!) // int *p5 = &a, *p6 = &b; // 两个都是指针 return 0; } ``` ### 输出: ``` a: 10 *ptr1: 10 b: 20 *ptr2: 20 修改后 a: 100 b: 200 ``` ### 解释: - 代码中`ptr1``ptr2`都是指针,使用方式相同。 - 在声明多个变量时,`int* p3, p4;`只有`p3`是指针,`p4`是整型变量。这可能会引起误解,因为从`int*`看起来似乎两个都是指针,但实际上不是。因此,在声明多个指针时,更推荐使用`int *p3, *p4;`这种风格,或者每行只声明一个变量。 ### 编程建议: 1. **一致性**:在项目中统一使用一种风格。 2. **可读性**:为了清晰,建议每行只声明一个变量: ```cpp int* ptr1; // 单独一行,避免歧义 int* ptr2; ``` 3. **理解本质**:无论哪种写法,指针的本质都是存储地址的变量。 ### 结论: `int* p``int *p`在C++中无区别,但要注意在多个变量声明时,`*`需要靠近每个指针变量名才能确保每个变量都是指针。 §§相关问题§§: 1. C++中如何声明指向指针的指针? 2. 在函数参数中,指针引用作为参数传递时有何性能差异? 3. 什么是常量指针指针常量?如何区分? 4. C++11中的智能指针如何解决传统指针的内存管理问题?</think>在 C++ 中,`int* p` `int *p` **没有任何实际区别**,它们是**完全等价**的语法形式。这两种写法都声明了一个名为 `p` 的指向整数的指针。空格在 C++ 类型声明中会被编译器忽略,因此选择哪种写法纯粹是编程风格的问题。 ### 代码示例与验证 ```cpp #include <iostream> using namespace std; int main() { int value = 42; // 两种写法声明指针 int* p1 = &value; // 写法1: *靠近类型 int *p2 = &value; // 写法2: *靠近变量名 cout << "初始值: " << value << endl; *p1 = 100; // 通过指针修改值 cout << "通过 p1 修改后: " << value << endl; *p2 = 200; // 通过另一个指针修改值 cout << "通过 p2 修改后: " << value << endl; // 验证它们指向同一个地址 cout << "\n地址验证:" << endl; cout << "value 地址: " << &value << endl; cout << "p1 指向: " << p1 << endl; cout << "p2 指向: " << p2 << endl; return 0; } ``` ### 输出结果: ``` 初始值: 42 通过 p1 修改后: 100 通过 p2 修改后: 200 地址验证: value 地址: 0x7ffeedb0a78c p1 指向: 0x7ffeedb0a78c p2 指向: 0x7ffeedb0a78c ``` ### 关键解释: 1. **语法等价性**: - 两种写法在编译器中生成相同的代码 - 编译器将 `*` 视为类型修饰符的一部分 - 空格位置不影响指针变量的性质 2. **风格差异**: - `int* p`:强调"指向int的指针"是一个类型 ```cpp int* p; // 强调 p 是 int* 类型 ``` - `int *p`:强调 `*p` 是一个整数 ```cpp int *p; // 强调 *p 是 int 类型 ``` 3. **多个变量声明时的陷阱**: ```cpp int* p1, p2; // 只有 p1 是指针,p2 是普通 int! int *p3, *p4; // p3 p4 都是指针 ``` 在声明多个变量时,`*` 只作用于它直接修饰的变量名。因此: - `int* p1, p2;` → `p1` 是指针,`p2` 是整数 - `int *p3, *p4;` → 两者都是指针 ### 编程风格建议: 1. **一致性原则**: - 在项目中保持统一的风格 - Google C++ 风格指南推荐 `Type* var` - Linux 内核风格推荐 `Type *var` 2. **最佳实践**: ```cpp // 推荐1:每行只声明一个变量(避免歧义) int* p1 = nullptr; int* p2 = nullptr; // 推荐2:在复杂类型中使用类型别名 using IntPtr = int*; // C++11 类型别名 IntPtr p3, p4; // 两者都是指针 ``` 3. **函数声明中的应用**: ```cpp // 两种写法都有效且等价 void modify_int(int* ptr); // 风格1 void modify_int(int *ptr); // 风格2 ``` ### 为什么会有两种风格? 历史原因:C++ 从 C 继承了指针语法。在 C 语言中,`int *p` 更常见,因为它强调声明表达式 `*p` 的结果是 `int` 类型。而 C++ 更强调类型系统,所以 `int* p` 逐渐流行。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值