这是我的代码有效。该函数将数组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()不起作用吗?
答案 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所以你遍历数组