数组和单个数据点使用指针之间的区别

Difference between the use of pointers for array and single data point?

本文关键字:指针 之间 区别 单个 数据 数组      更新时间:2023-10-16
#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=&var[0];

而不是

ptr=var;

如果 var 会是这样的

int var=49;

然后,我的推理版本成立,早期程序失败。他们对数组和单个数据点的指针有什么独特的概念吗?

我不明白为什么这段代码应该按照正确的语法工作

ptr=&var[0];

而不是

ptr=var;

分配指针的两种方法是等效的。在将数组变量分配给指针的表达式中C++将数组名称解释为指向数组初始元素的指针,即 &var[0] .

如果 var 会是这样的

int var=49;

然后,我的推理版本成立,早期程序失败。

这是因为C++提供了从数组到指针的隐式转换,而不是从标量变量到指针的隐式转换。

首先,我们应该明白指针和数组在 C 或 C++ 中的处理方式相同,至少在我们超越定义后是这样。让我们确保我们了解一些事情。从您上面描述的示例来看,以下内容是等效的(在 ptr=var 之后)。

var[0], *var, ptr[0], ptr.全部 == 10。

在以下情况下:

ptr = &var[0];

那就是分配 var 的第一个元素的地址。另一种说法是 &var 是指向 int 的指针。我们知道 var 是指向 int (int *) 的指针,而 *var 是 int

如果 *var 和 var[0] 是等价的,那么我们做的是 *(&var) 的等价物,它只是 var。

也许为了更清楚地说明这一点,你可以考虑一个不同于 0 的索引。 var[1] 与 (var + 1) 相同。它认为:

ptr = var + 1

ptr = &var[1]

它们只是表达同一件事的两种不同方式。

在 int var=49 示例中,var 是一个 int,而不是指向 int 的指针(请记住,数组只是一个指针,因此指向 int 的指针与 int 数组相同)。您可以将其表示为:

int var=49;
ptr = &var;

然后,如果您删除循环(或设置 MAX=1),您将获得所需的结果。

将 * 视为删除寻址级别(指针)和 & 添加寻址级别。这有点令人困惑,因为 * 在定义它们时会做相反的事情。

int **i;

表示指向 int 指针的指针。然后:

&i - 指向指向 int 指针的指针的指针。i - 指向整数指针的指针。*i - 指向整数的指针**i - inti[0] - 整数指针*i[0] - 国际

C 和 C++ 中的指针只是另一种数据类型。"他们的数组和单个数据点的指针有什么独特的概念吗?"这个问题有点缺陷,因为在你的例子中,你有一个数组(相当于一个指针),而不是一个指向指针的数组。单个数据点(在第二个示例中为 int var=49)仍然具有地址,但不是数组,因此它不是指针类型,而是整数类型。您可以轻松地将其描述为:

int var[1] = {49};

这是一个指向单个 int 的数组(指针),不应与 int 混淆。

数组名称将其第一个元素的地址保存在内存中。 即指针。

int array[2] = {1,2}; // "array" is a pointer to array[0]
int **p = &array;  //pointer to pointer to array[0]

数组的名称是数组第一个索引的reference。为数组分配pointer的正确方法是:

int *ptr = arrayName;

int *ptr = &arrayName[0];

要记住的另一件事是,您可以将偏移量添加到指针以引用数组的其他元素。这将指向 aray *ptr++; OR *ptr+=1; 的第一个值。而使用变量指针执行此操作会产生意想不到的结果。