Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对数组的引用究竟是如何工作的?_C++_Arrays_Reference - Fatal编程技术网

C++ 对数组的引用究竟是如何工作的?

C++ 对数组的引用究竟是如何工作的?,c++,arrays,reference,C++,Arrays,Reference,我在这里看到一个独特的例子,并试图理解为什么他的代码片段的行为方式是这样的 // uninitialized mem char test[99999]; // test[0] = 'a'; test[1] = 'b'; test[2] = 'c'; test[3] = 'd'; test[4] = 'e'; test[5] = 'f'; test[6] = 'g'; for (int i = 0; i < 99999; i++) { cout << (&

我在这里看到一个独特的例子,并试图理解为什么他的代码片段的行为方式是这样的

// uninitialized mem
char test[99999];


//
test[0] = 'a';
test[1] = 'b';
test[2] = 'c';
test[3] = 'd';
test[4] = 'e';
test[5] = 'f';
test[6] = 'g';


for (int i = 0; i < 99999; i++) {
    cout << (&test[i])[i] << endl;
}

<> P>当您考虑数组索引实际上在做什么时,它会变得更加明显。

给定一个数组测试,通常使用test[n]访问测试的第n个元素。然而,这实际上相当于*test+n。这是因为指针上的添加会自动将添加的数量与所指向类型的大小相乘。这意味着如果向指针添加一项,指针将指向数组中的第二项,如果添加两项,指针将指向第三项,依此类推

然后,您提供的代码引用该值,因此您最终得到&*test+n。然后,reference&和dereference*操作相互抵消,这意味着您只得到test+n

然后,代码对该值执行另一个数组索引,因此最终得到test+n[n],它也可以写成*test+n+n。如果你简化它,你会得到*test+n+n,可以重写为*test+2*n


很明显,如果你把它转换成数组索引符号,你就得到了测试[2 *N],它以简单的形式表示你将查询数组中的其他元素。

当你考虑数组索引实际上在做什么时,它应该变得更加明显。 给定一个数组测试,通常使用test[n]访问测试的第n个元素。然而,这实际上相当于*test+n。这是因为指针上的添加会自动将添加的数量与所指向类型的大小相乘。这意味着如果向指针添加一项,指针将指向数组中的第二项,如果添加两项,指针将指向第三项,依此类推

然后,您提供的代码引用该值,因此您最终得到&*test+n。然后,reference&和dereference*操作相互抵消,这意味着您只得到test+n

然后,代码对该值执行另一个数组索引,因此最终得到test+n[n],它也可以写成*test+n+n。如果你简化它,你会得到*test+n+n,可以重写为*test+2*n

显然,如果您将其转换回数组索引符号,您将得到test[2*n],它以简单的形式表示您将查询数组的其他每个元素。

这就是发生的情况: 数组只是一个连续的内存块

&test
正在获取数组起点的索引的地址。不是价值

当您添加[some number]时,它会将数字乘以数据类型的大小,在本例中,每个字符都是一个字节

所以当你这么做的时候

&test[i]
这意味着起始地址+i字节

当你这样做的时候

(&test[i])[i]
您正在从起始地址开始执行i字节,然后将其视为起始地址,再向上执行i个字节

因此,在迭代中:

(&test[0])[0] // index 0 + 0 = 0
(&test[1])[1] // index 1 + 1 = 2
(&test[2])[2] // index 2 + 2 = 4
(&test[3])[3] // index 3 + 3 = 6
这就是正在发生的事情: 数组只是一个连续的内存块

&test
正在获取数组起点的索引的地址。不是价值

当您添加[some number]时,它会将数字乘以数据类型的大小,在本例中,每个字符都是一个字节

所以当你这么做的时候

&test[i]
这意味着起始地址+i字节

当你这样做的时候

(&test[i])[i]
您正在从起始地址开始执行i字节,然后将其视为起始地址,再向上执行i个字节

因此,在迭代中:

(&test[0])[0] // index 0 + 0 = 0
(&test[1])[1] // index 1 + 1 = 2
(&test[2])[2] // index 2 + 2 = 4
(&test[3])[3] // index 3 + 3 = 6

&这里是操作员的地址。&这里是操作员的地址。这个答案表明&test[i]意味着&test[i]。没有。它的意思是测试[i]。没有应用[i]的&test。它允许您将整个数组解引用括在括号中,并将其作为起始指针计数&&test[i][i][0]和&&test[i][i][0][0]也会给出同样的结果result@brianxautumn在最后一段中,你有“1+1=1”。我确实尝试过编辑,但编辑必须至少为6个字符。。。。。这个答案表明&test[i]意味着&test[i]。没有。它的意思是测试[i]。没有应用[i]的&test。它允许您将整个数组解引用括在括号中,并将其作为起始指针计数&&test[i][i][0]和&&test[i][i][0][0]也会给出同样的结果result@brianxautumn在最后一段中,你有“1+1=1”。我确实尝试过编辑,但编辑必须至少为6个字符。。。。。不过,你也许能把它修好。