消息关闭
    暂无新消息!

在定义指针时,写成

int* p;

int *p;

都能编译通过。但是,应当怎样理解*intp的关系呢?
也就是说,这个语句应该理解成 int *p ,还是 int* p 呢?
int *pint (*p)是等价的吗?那int (*p)[5]int *p[5]为什么是两个不同的语句?
可以将*看做一种数据类型吗?int*整体是一种数据类型吗?
这里的*与使用指针时的取变量运算符*是一个东西吗?

C++初学者诚心向大神请教一二


6个回答

︿ 3

我只想说我的编码规范是:

int * p;
int & r_p;
int * p1, * p2;
void  (* func)();
︿ 2

int* p; 比较合适,这就是为什么 int (*p)[5]int *p[5] 不是一个概念

* 不是一种类型,你不需要纠结 * 是什么东西,语法就是这样的

定义时的 * 仅仅是与类型搭配使用的一般意义的指针

表达式中变量前的 * 是另一个概念:解引用

︿ 1

从编译器的角度来说,*应该是一个独立的token,因此,int* p, int * p, int *p对编译器来说其实是一样的。*会优先与变量结合,因此写成int* a, b是不合适的,它等价于int *a, b,后者更加的复合直觉。
然而,如果你想让*与类型结合,写成(int*) a, b,却是通不过编译的。因此,如果你想使用一个int*的类型,应该使用typedef,例如typedef int* PINT,如此你就可以这样定义两个指向int的指针变量了:PINT pa, pb

︿ 0
  • 首先,*并不是数据类型,在C/C++中它叫做修饰符

  • 它是用来修饰前面一个类型的

  • *表示的是指针修饰符,定义的是一个指针

  • 因为修饰符是修饰前一个类型的,所以int*比较合适,但是在被修饰类型和修饰符中间加空格,并不会影响编译器的解析

  • 所以int* p中,类型是int*,表示“int的指针”,或者“指向int类型数据的指针”,p是这个int*的变量名

  • int (*p)[5]int *p[5]不是一个概念就很好解释了,因为前者,将p转成了指针,将转换结果声明成int型,而后者则是直接声明了一个int型指针p

︿ 0

可以参考一下有名的项目。比如 Nginx 和 Linux 都是写成 int *p 的。

所以,我们学习他们就行了。

int *a, b;,这样可以很轻松地知道,a 是指针,b 是值。

int* a, b;,看上去像 a 和 b 都是指针,但其实并不是。

看了楼上发的链接,学习到了。

︿ 0

you can refer to here

In my perspective, int * is better, though both are legal. While declaring multiple variables in the same line(int *a = &another_integer, b = 0), we can find a is a pointer to integer and b is integer, so int* a = &another_integer, b = 0 may mislead people.