C语言 为什么这种指针算术在函数中起作用,但在 main 中不起作用



这是我的代码。该函数将数组 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;
}

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

在函数pointer中,参数a是一个指针。但是在main中,a是一个数组,你不能修改数组名,所以*a++ = i是无效的。

我什至无法编译您的代码,并且该错误说明了原因:

$ 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;
}

C 数组在某些情况下会衰减为指针,但它们不是指针。使用 p 而不是 a。

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

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

在函数中,您将数组地址点传递给指针。 指针在您递增每个变量时访问它。 这称为行走指针。但是如果你在main中使用它,你假设数组是一个简单的.想想编译器声明的数组,比如

int *const array;

所以当你尝试递增它时。 它会弹出一个错误。 所以再用一个 步行指针 里面主所以 u 遍历数组

相关内容

  • 没有找到相关文章

最新更新