C 为什么这种指针算法在函数中有效,而在Main中无效?

C 为什么这种指针算法在函数中有效,而在Main中无效?,c,arrays,pointers,pointer-arithmetic,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]); } } int main(无效) { int a[4];

这是我的代码。该函数将数组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]);
    }
}
int main(无效)
{
int a[4];
指针(a);
返回0;
}
无效指针(int*a)
{
int*p,i;
p=a;
对于(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;
}
int main(无效)
{
int a[4],*p,i;
p=a;
对于(i=0;i<4;i++)
{
*a++=i;
printf(“%d”,p[i]);
}
返回0;
}

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

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

在函数
指针中,参数
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;
}
#包括
内部主(空)
{
int a[4],i;
int*p=a;
对于(i=0;i<4;i++)
{
*p++=i;
printf(“%d”,a[i]);
}
返回0;
}

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

$ 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;
}
#包括
内部主(空)
{
int a[4],i;
int*p=a;
对于(i=0;i<4;i++)
{
*p++=i;
printf(“%d”,a[i]);
}
返回0;
}

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


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

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


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

您应该知道数组和指针之间的区别。我建议。
在函数中,你放入的数组将指向指针(指向数组的第一个元素),它是指针的一个变量,所以你可以进行递增,在主要情况下,a是第一个元素的地址,它是常量,所以你不能更改。你应该更改指针p。

你应该知道数组和指针之间的区别。我建议。
在函数中,您放入的数组将指向指针(指向数组的第一个元素),它是指针的变量,因此您可以进行递增,在主要情况下,a是第一个元素的地址,它是常量,因此您不能更改。您应该更改指针p。

在函数中,您将数组地址点传递给指针。当u递增每个变量时,指针正在访问它。这称为移动指针。 但如果你在主界面中使用它,你会假设数组是一个简单的数组。想象一下编译器声明的数组,比如

int*常量数组

所以当你试图增加它时。它突然出现了一个错误。所以在里面多用一个移动指针
在将数组地址点传递给指针的函数中,main so u遍历数组。当u递增每个变量时,指针正在访问它。这称为移动指针。 但如果你在主界面中使用它,你会假设数组是一个简单的数组。想象一下编译器声明的数组,比如

int*常量数组

所以当你试图增加它时。它突然出现了一个错误。所以在里面多用一个移动指针
main所以你遍历数组

,因为
a
是一个数组,而不是一个点。你的第二个版本甚至没有编译。此外,您删除了
p
变量,因此即使可以增加数组类型的值,也会得到错误的索引。等等,为什么要更改代码?如果它现在包含了你从答案中学到的东西,不要这样做。我脑海中闪过一条基本的语句“数组的基址是固定的”,因为
a
是数组,而不是指针。第二个版本甚至都没有编译。此外,您删除了
p
变量,因此即使可以增加数组类型的值,也会得到错误的索引。等等,为什么要更改代码?如果它现在包含了你从答案中学到的东西,不要这样做。这只会把后来来的人弄糊涂。我脑海中闪过一句基本的话:“数组的基址是固定的”