【问题标题】:What the difference between int *p and int* pint *p 和 int* p 有什么区别
【发布时间】:2014-09-25 11:52:42
【问题描述】:

我见过很多使用 int* 声明变量的代码。我知道int*p 声明了一个整数类型的变量,它是一个指针。但是int* p 做了什么? 例如:

int* x,y,z;

这是否意味着所有三个变量都是指针?我们可以用 int *x,*y,*z 代替这个吗?

【问题讨论】:

  • ***我知道 int *p 声明了一个整数类型的变量,它是一个指针。 ***
  • 最初在 C 中类型是指向的东西,所以你会读它:“p 的整数内容”。语法反映了在声明多个用逗号分隔的变量时。 Straustrup 说他觉得类型是指针而不是内容,更好地表达int* p 更像是:“指向 p 的整数指针”。当您声明多个以逗号分隔的变量时,这种查看类型的方式在除了的每个地方都是可能的。由于向后兼容性问题,这无法更改。因此,这完全是概念性的,以及您如何查看类型。
  • 功能上没有区别。有些人喜欢一个,有些人喜欢另一个(有些人用int * x;来区分差异)。要理解的关键是 int* x,y,z; 声明了一个指针和 2 个整数,无论​​ * 周围的空格放在哪里。
  • @Rohan int *p 声明了一个指向整数类型的变量。
  • 这能回答你的问题吗? Placement of the asterisk in pointer declarations

标签: c++ pointers int


【解决方案1】:

int *pint* p 有什么区别?

除了需要分隔标记的地方(这里没有),空格永远不会影响 C++ 代码的含义。两者具有相同的含义(对于int * pint*p);间距纯属个人喜好。

这是否意味着所有三个变量都是指针?

不,只有第一个是指针。在这种情况下,间距有点误导,所以有些人更愿意让关联更清晰:

int *x, y, z;

或者,更好的是,不要尝试在单个声明中声明多种类型的变量:

int * x;
int y,z;

如果你希望它们都是指针,那么你必须为每个指定它:

int *x, *y, *z;  // adjust spacing to taste

【讨论】:

  • 如果你想要三个都作为指针,声明为:int *x, *y, *z;而不是 int *x, y, z;后者将 x 声明为整数指针,但将 y, z 声明为 int。 * 的位置应该在变量之前(空格可选)
  • @DebasishJana:确实;这正是我所说的。
【解决方案2】:

有两种方法可以“查看”变量p

  • 您可以将p 视为int* 类型的变量。

  • 您可以将*p 视为int 类型的变量。

因此,有些人会声明int* p,而另一些人会声明int *p

但事实是这两个声明是相同的(空格没有意义)。

您可以使用p 作为指向整数值的指针,或使用*p 作为实际指向的整数值。

假设p 指向一个有效的内存地址,并且取决于访问权限:

  • 可以获取(读取)指向的数据,例如int c = *p

  • 可以设置(写入)指向的数据,例如*p = 5


在同一行声明多个变量时,编译器假定类型没有星号。

因此,对于int *x,y,z,只有x 被视为int 指针。

如果您希望将yz 视为int 指针,则需要使用int *x,*y,*z

因此在类型和星号之间使用空格可能是更好的编码约定。

就个人而言,我总是在单独的行中声明指针变量(每个变量一行)。

【讨论】:

  • @EmilioGaravaglia:是的,我正在添加它(请参阅更新的答案)。
猜你喜欢
  • 2019-11-06
  • 2021-12-30
  • 2016-01-23
  • 2019-08-14
  • 2021-01-05
  • 2013-08-14
  • 1970-01-01
  • 1970-01-01
  • 2021-12-12
相关资源
最近更新 更多