// 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
最佳答案
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
(使用*buf
或buf[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]; // ???
}
|
int n = 42; int* p = &n; p[0]++;
也是合法的。–
buf
是一个指针(指向数组的第一个元素)。–
c
总是0
(在您的代码中)时,a += buf[c][i];
它与相同。a += (*buf)[i];
–
new
,其内容将不会被初始化。所有元素都将具有不确定的值。而在 C++ 中,以任何方式使用不确定的值都会导致未定义的行为。使用所示的代码,您可以使用 来做到这一点buf[i] += i
。–
–
|