为什么这种指针算法在函数中起作用,但不在主函数中?

时间:2014-01-08 01:24:20

标签: c arrays pointers pointer-arithmetic

这是我的代码有效。该函数将数组a初始化为值0 - 3

int main(void) 
{
    int a[4];

    pointer(a);

    return 0;
}

void pointer(int* a)
{
   int *p, i;
   p = a;

   for(i = 0; i < 4; i++)
   {
       *a++ = i;
       printf(" %d", p[i]);
    }
}

但是当我将它全部组合到main()中时,它就不再有用了。

int main(void) 
{
    int a[4], *p, i;
    p = a;

    for(i = 0; i < 4; i++)
    {
        *a++ = i;
        printf("%d", p[i]);
    }

    return 0;
}

相反,它打印出内存地址或其他东西。它在我动态分配[]时有效,所以我猜它与内存中管理[]的方式有关。有人能告诉我为什么第二个main()不起作用吗?

5 个答案:

答案 0 :(得分:4)

在函数pointer中,参数a是一个指针。但在main中,a是一个数组,您无法修改数组名称,因此*a++ = i无效。

答案 1 :(得分:4)

我甚至无法编译您的代码,错误说明了原因:

$ gcc -o foo foo.c
./foo.c:9:11: error: cannot increment value of type 'int [4]'
        *a++ = i;
         ~^
1 error generated.

您根本没有在代码中使用指针。如果您按照以下方式更改它,它将按预期工作:

#include <stdio.h>

int main(void) 
{
    int a[4], i;
    int* p = a;

    for(i = 0; i < 4; i++)
    {
        *p++ = i;
        printf("%d", a[i]);
    }

    return 0;
}

答案 2 :(得分:1)

C数组在某些环境中衰减为指针,但它们不是指针。使用p代替a。

当您动态分配a时,它会起作用,因为malloc()会返回指针,而不是数组。

答案 3 :(得分:0)

你应该知道数组和指针之间的区别。我建议。 在函数中,你放入的数组将转向指针(指向数组的第一个元素),它是指针的变量,所以你可以做增加,在main中,a是第一个元素的地址,它是常量,所以你可以不要改变。你应该改变指针p。

答案 4 :(得分:0)

在将数组地址指针传递给指针的函数中。当你递增它时,指针正在访问每个变量。这被称为行走指针。 但是如果你在主要用途中使用它,假设数组很简单。想想编译器声明的数组,如

  

int * const array;

所以当你尝试增加它时。它弹出一个错误。所以在里面再使用一个步行指针 main所以你遍历数组