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