C 为什么这种指针算法在函数中有效,而在Main中无效?
这是我的代码。该函数将数组a初始化为值0-3C 为什么这种指针算法在函数中有效,而在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];
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
变量,因此即使可以增加数组类型的值,也会得到错误的索引。等等,为什么要更改代码?如果它现在包含了你从答案中学到的东西,不要这样做。这只会把后来来的人弄糊涂。我脑海中闪过一句基本的话:“数组的基址是固定的”