【问题标题】:C++ pointers incorrect syntax? [duplicate]C++ 指针语法不正确? [复制]
【发布时间】:2016-05-20 13:37:16
【问题描述】:

我在这个链接中看到了这段代码-http://www.tutorialspoint.com/cplusplus/cpp_pointers_vs_arrays.htm。看第一段代码。

#include <iostream>

using namespace std;
const int MAX = 3;

int main ()
{
int  var[MAX] = {10, 100, 200};
int  *ptr;

// let us have array address in pointer.
ptr = var;
for (int i = 0; i < MAX; i++)
{
   cout << "Address of var[" << i << "] = ";
   cout << ptr << endl;

   cout << "Value of var[" << i << "] = ";
   cout << *ptr << endl;

   // point to the next location
   ptr++;
}
return 0;
}

不应该是ptr = &amp;var 而不是ptr = var 吗?它在评论下方。为什么简单地声明为var 而不是&amp;var

【问题讨论】:

  • 在数组的情况下,名称可以用作指针。

标签: c++ arrays pointers


【解决方案1】:

var 将衰减为指向其第一个元素的指针。

ptr = var;

等价于

ptr = &var[0];

&amp;var 是指向数组的指针,而不是指向int

int (*aptr)[MAX] = &var;

会是有效的,但并不意味着相同 - *aptr 是一个包含 MAX 元素的数组,而不是 int

本教程声称“指针和数组在许多情况下可以互换”是完全错误的。

您唯一可以“交换”任何东西的情况就是这种情况;当某些东西需要一个指针时,数组会衰减为指向其第一个元素的指针。
没有一种情况可以使用指针代替数组。

令人困惑的是,ptr 在非正式对话中经常被称为“指向数组的指针”甚至是“数组”,尽管这在形式上是不正确的。
这是因为“指向数组的第一个元素的指针”非常冗长,而且对于非初学者来说,通常可以从上下文中清楚地了解实际含义。

【讨论】:

  • 谢谢。我现在明白为什么那个语法是正确的了。
  • “没有一种情况可以使用指针代替数组”可以说是“更错误”而不是“它们是完全可交换的”。对于像参数传递、在指针算术表达式和索引中的使用,这些都是数组和指针最常见的操作,它们确实是完全可以互换的
  • @PeterA.Schneider 数组->指针衰减的更多示例。 “可互换”是双向的。
【解决方案2】:

在赋值、参数传递等中,数组“衰减”为指向其第一个元素的指针。这将是一个指向 int 的指针,这就是 p 声明的内容。

您实际上可以获取数组的地址,尽管它不太常见。那么地址就是整个数组的地址,像这样:

int (*parr)[3] = &var;

现在可以说,例如,int i = (*parr)[1];var 的第二个元素100 来初始化i

整个数组的地址在数值上与其第一个元素的地址相同,因为毕竟第一个元素是数组的开始位置。这似乎很有趣:那有什么意义呢?

区别在于类型,它(除了关于类型兼容性的语法问题——但你总是可以在 C 中抛弃这些!)决定了当你做指针算术时会发生什么。考虑

int *ptr = var;
int (*parr)[3] = &var;

printf("ptr: %p, parr: %p\n", ptr, parr);
printf("Increment ptr: %p, incremented parr: %p\n", ptr+1, parr+1);

【讨论】:

  • 谢谢。我明白了。
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
  • 2018-06-24
  • 1970-01-01
  • 2016-07-21
  • 2018-03-22
  • 2011-03-17
相关资源
最近更新 更多