关于C/C++指针星号 * 的写法问题

声明

为了方便理解,本文所举例中采用的"数据类型"都默认用 int 类型。

问题

对比下面不同的书写方式,请仔细体会区别与含义:

cpp 复制代码
int* p;
int *p;

您感到什么了吗?

解释

首先要说明,在现代中,很多C++编程规范中,建议星号*与 int 结合,而不是与后面的变量结合。

这样做比较清晰,不容易看错。如下所示,变量 p 里面是记录了变量 num 的"地址"信息:

复制代码
int* p = #

但是这样做也会产生一定的问题,如下所示:

cpp 复制代码
int* p1, *p2, p3;

// 请注意,上面只定义了两个指针变量,分别是 p1 和 p2;而 p3 只是普通变量(int类型)

解决这个问题也很简单,我们只需要规定,一行只能声明一个变量即可,特别是对指针类型来说。

cpp 复制代码
int* p1;    // 指针
int* p2;    // 指针
int p3;    // 普通变量

值得说明的是,这只是一种规范,一种建议;如果不遵守,程序也不会报错。

其次要解释的是,C 语言设计的本意并不是把(int*)作为一个整体。

它的设计本意是解一个方程,请看下面的例子:

先定义一个变量,即,将 (*p) 当作一个整体,然后让(*p)的类型是 int。

从而就能反推出 p 是 int 指针。

这种解方程的语法含义,才是 int *p1, *p2;写法的由来。

同理,函数指针也是这样,int (*func)();

最早调用是必须写成 (*func)() 的,但是经过修改后,写 func() 也可以了。

但是本意是"解方程"这种思想。

后来C++的加入,迫使C的规矩出现了一些变化。

但是不论如何,建议用自己最熟悉的就行。

而笔者本人是习惯了int* p; 这种写法。

补充

不管是哪种方式,有一个通用的方法可以快速区分到底是"指针"还是"普通变量"------方法就是,看这个变量前面有没有 * ,如果有 * 就代表它是指针,如果没有 * ,那就它就是普通的变量。

cpp 复制代码
int* p;    // p 前面有*,所以是指针
int *p1,*p2, p3;    // p1 前面有*,p2前面有*,p3前面没有*,所以p1,p2是指针,而p3是普通变量

OK,就补充这么多,如果有什么错误的地方,欢迎小伙伴们的指正。

相关推荐
云雾J视界33 分钟前
从位运算到状态机:用纯C重构红外/DS18B20/I²C协议,告别“黑盒库“的嵌入式实战指南
c语言·数据库·重构
止观止36 分钟前
实战演练:用现代 C++ 重构一个“老项目”
c++·实战·raii·代码重构·现代c++
代码游侠3 小时前
日历的各种C语言实现方法
c语言·开发语言·学习·算法
草莓熊Lotso3 小时前
unordered_map/unordered_set 使用指南:差异、性能与场景选择
java·开发语言·c++·人工智能·经验分享·python·网络协议
咔咔咔的5 小时前
1930. 长度为 3 的不同回文子序列
c++
Cinema KI10 小时前
吃透C++继承:不止是代码复用,更是面向对象设计的底层思维
c++
Dream it possible!13 小时前
LeetCode 面试经典 150_二叉搜索树_二叉搜索树中第 K 小的元素(86_230_C++_中等)
c++·leetcode·面试
玩转C语言和数据结构14 小时前
C语言编程入门攻略(最新学习路线,适合新手小白)
c语言·c语言入门·c语言下载·c语言知识点总结·c语言自学·c语言教程·c语言怎么学
Bona Sun14 小时前
单片机手搓掌上游戏机(十四)—pico运行fc模拟器之电路连接
c语言·c++·单片机·游戏机
oioihoii14 小时前
性能提升11.4%!C++ Vector的reserve()方法让我大吃一惊
开发语言·c++