我已经开始了 C 入门类(class)。我无法解释运行下面的代码所得到的输出
./a.out 6
输出是:
Array A elements: 0 1 2 3 4 5
Array B elements: 1 2 3 4 5 796830176
我认为代码在做什么: 当manup_array执行时,各个指针的每个值都会增加,但由于它是后修复的,所以只有在返回原始值之后才会生效。
确实如此,当我们首先打印数组 A 时,我们得到 0 1 2 3 4 5
(即在递增之前)。
随后,当我们打印数组 B 时,增量生效,因此我们得到 1 2 3 [...]
真正让我困惑的是为什么最后一个数字是 796830176。此外,在不同的计算机上运行它每次都会产生不同的最后一个数字,这表明指针寻址在某种程度上对此负有责任。
有人可以向我解释一下吗?
注意: 如果我使用前缀运算符,每个数组的输出都是相同的 (1 2 3 4 5 6)。这与我认为正在发生的情况一致 -> 指针不会改变;仅更新值。
#include <stdio.h>
#include <stdlib.h>
void manup_array(int *array[], int n); // Forward declaration.
int main(int argc, char *argv[])
{
// The size N of 2 arrays are the same; obtain them from cmd line.
int N = atoi(argv[1]); // Convert from str to int in C.
int arrayA[N]; // Declare integer array.
int *arrayB[N]; // Declare integer pointer array.
for (int i = 0; i < N; i++)
{
arrayA[i] = i;
arrayB[i] = &arrayA[i]; // Assign address of each element in A to element in B.
}
manup_array(arrayB, N);
printf("Array A elements: ");
for (int i = 0; i < N; i++)
{
printf("%d ", arrayA[i]);
}
printf("\n");
printf("Array B elements: ");
for (int i = 0; i < N; i++)
{
printf("%d ", *arrayB[i]);
}
printf("\n");
return 0;
}
void manup_array(int *array[], int n) { // Take in B as input, then increase each elem by 1
for (int i = 0; i < n; i++)
{
*array[i]++;
}
}
最佳答案
这确实是一段晦涩的代码。它的作用是什么:
该函数采用指针数组作为参数。由于函数的参数类型为 int *array[]
, array
项目的任何更改会影响调用者并改变arrayB
.
该函数有趣的部分是*array[i]++;
。 C 中的运算符优先级规则规定 [] 的优先级高于后缀++,后缀++ 的优先级高于一元 *。
自 array
是一个指针数组,array[i]
给你一个指针。不是它所指向的值。然后++
递增指针以指向 arrayA
中的下一项主要的.
最后有一个 *
它获取该指针所指向的内容,然后对它们不执行任何操作。 *
是多余的,只是为了让读者感到困惑。
所以回到main,你已经改变了arrayB
的所有指针。 arrayB[0]
现在指向 arrayA[1]
等等。 arrayB 的最后一项将指向 arrayA 末尾之后的一项,因此对于最后一项,您访问数组越界并获得垃圾值。
关于c - 整数指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21672090/