// Declaring a variable:
int* buf = new int[max_size];

// Filling in the data:
for (int i = 0; i < max_size; ++i) buf[i] += i;

// We pass it to the function:
process(&buf);

实现功能:

void process(const int* const* buf)
{
  int a = 0;
  int ch = 1;
  for(int c = 0; c < ch; ++c)
    for (int i = 0; i < max_size; ++i)
      a += buf[c][i]; // ???
}

我的数组是如何以及根据什么规则伪装成数组的数组的?
a += buf[c][i];

请尝试这里:https:

PS:我认为这是因为这里&but我们传递了零件的地址const float* const* buf。但也许对此有更学术的解释?

7

  • 同样的方式int n = 42; int* p = &n; p[0]++;也是合法的。


    – 


  • 指针不是数组,数组不是指针。buf是一个指针(指向数组的第一个元素)。


    – 


  • 1
    如果您喜欢这种语法,那么c总是0(在您的代码中)时,a += buf[c][i];它与相同。a += (*buf)[i];


    – 

  • 2
    请注意,当您使用 分配“数组”时new,其内容将不会被初始化。所有元素都将具有不确定的值。而在 C++ 中,以任何方式使用不确定的值都会导致未定义的行为。使用所示的代码,您可以使用 来做到这一点buf[i] += i


    – 

  • 旁注:不要在 C++ 代码中使用 C 数组。1) 存在更好的替代方案。2) C 数组有很多特性,如果您使用 C++ 容器,这些特性就会“消失”。


    – 


最佳答案
3

要了解发生了什么,您必须了解对于任何指针(或数组)p和索引i,表达式p[i]完全等于*(p + i)

这是因为buf[c],根据您所显示的代码,将始终为buf[0],这与 相同*(buf + 0),与 相同*buf

因此buf[0][i]与 相同(*buf)[i]。也就是说,您取消引用指向指针的指针变量buf以获取 返回的原始指针new[],然后取消引用该指针以获取特定元素。


为了更图形化地展示它并希望更好地帮助您,process函数内部的变量buf看起来像这样:

+-----+ +----------------------------+ +---+---+--- +-----+
| buf | --> | (new[] 返回的指针) | --> | 0 | 1 | 2 | ... |
+-----+ +----------------------------+ +---+---+--- +-----+

当您取消引用buf(使用*bufbuf[0])时,您将在上图中直接转到“new[] 返回的指针”。

当您依次取消引用该指针(使用索引i)时,您再次在图中直接进入相应的元素。

如果您问为什么a += buf[c][i];有效,那是因为 buf 是指向数组第一个元素的指针。

由于 c 的 for 循环只运行 0 <= c < 1。这一行本质上

a += buf[0][i];

哪一个

a += (*buf)[i];

(仅供参考,一般来说ptr[i] == *(ptr+i)

即,您取消引用 buf 以获取指向数组的指针,然后取消引用数组的第 i 个成员。

此代码有多个问题

// Declaring a variable:
int* buf = new int[max_size];

std::array<int, max_size>如果 max_size 是编译时常量,那么您可能应该在 C++ 中使用。否则std::vector<int>(max_size)是一个不错的选择,这样您就不必手动管理内存。

// Filling in the data:
for (int i = 0; i < max_size; ++i) buf[i] += i;

这里,你假设你的数组在每个元素处都设置为 0,这是错误的,你应该初始化它。

// We pass it to the function:
process(&buf);

这里,没有理由将指针传递给 buf,因为 buf 已经是一个指针。

你的流程功能应该是这样的。

void process(const int* buf)
{
  int a = 0;
  for (int i = 0; i < max_size; ++i)
    a += buf[i];
}

我建议阅读有关 C++ 的资料并了解该语言的特性。

0

我的数组是如何以及根据什么规则伪装成数组的数组的?

您提供的代码将其声明buf为指向动态分配的整数数组的指针,其大小为 max_size。因此,buf指向的指针first element of a one-dimensional array of integers

int* buf = new int[max_size];

此外,process 函数需要一个指向的指针a pointer to a constant int,传递给此函数的参数是&buf,其类型为int**。这里,buf是 类型const int* const*,因此 buf[c] 取消引用数组中的第一个指针。

void process(const int* const* buf)
{
  int a = 0;
  int ch = 1;
  for(int c = 0; c < ch; ++c)
    for (int i = 0; i < max_size; ++i)
      a += buf[c][i]; // ???
}