c - 整数指针数组

标签 c arrays pointers

我已经开始了 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/

相关文章:

c++ - 在堆上声明对象然后通过引用传递它?

c++ - 具有大型 C 和 C++ 代码库的 Gtest

C 使用 = { { '?' , '?' , '?' , '?' } } 初始化结构体;

c++ - 多阵列动态内存分配错误

android - 从 xml 文件中获取保存的 X 和 Y 数组点?

c - 指向数组的指针

c - 这个C程序是做什么的?

c - 如何在C中连接两个整数

c - 将一棵树展平成一个数组

c++ - 引用是否被视为 C++ 中的指针