整数指针数组

时间:2014-02-10 08:22:58

标签: c arrays pointers

我已经开始了C的入门课程。我无法解释我从运行下面的代码得到的输出

./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]++;
    }
}

3 个答案:

答案 0 :(得分:1)

这是非常模糊的代码。是做什么的:

该函数将一个指针数组作为参数。由于函数的参数类型为int *array[],因此array项的任何更改都会影响调用者并更改arrayB

该函数的有趣部分是*array[i]++;。 C语言中的运算符优先级规则[]具有比postfix ++更高的prio,后者具有比一元*更高的prio。

由于array是指针数组,array[i]会为您提供指针。不是它指出的价值。然后++递增指针以指向main arrayA中的下一个项目。

最后有一个*,它获取指针指向的内容,然后对它们不做任何处理。 *是多余的,只是让读者感到困惑。

回到主要部分,你已经改变了arrayB的所有指针。 arrayB[0]现在指向arrayA[1],依此类推。 arrayB的最后一项将指向一个项目超过arrayA的结尾,因此对于最后一项,您访问数组越界并获得垃圾值。

答案 1 :(得分:0)

manup_array()递增指针,而不是预期的值。

已修改 manup_array()。

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]++;
        (*array[i])++;
    }
}

我建议推荐Pointer Arithmetic: ++*ptr or *ptr++?

答案 2 :(得分:0)

void manup_array(int *arr[], int n) { // Take in B as input, then increase each elem by 1
    for (int i = 0; i < n; i++)
    {
        int val = (*arr[0]); // get the value pointed to by the current value of arr
        val++;               // increment it
        *(arr[0]) = val;     // assign it back
        arr++;               // increase the pointer
    }
}

令人难以置信的迟钝,但它表明了你的意思以及你的模糊代码如何混淆操作员。

添加,使调试更容易!