[英]passing array pointer to function in C
在我的main()
函数中,我初始化数组指针*AD
并使用for循环将数组A[5]
的地址复制到指针AD[5]
。 当我将此指针AD
传递给函数row1()
并将其所有值(在AD中)分配给I[5]
我得到的是A[5]
的实际值而不是地址。 另一方面,当我在main()
打印AD[5]
指针的值时,我得到了地址。 我正在使用DEV c ++编译器。
为什么在函数中我得到真实的价值?
#include <stdio.h>
int main(void)
{
int test;
int A[5];
int *AD[5];
FILE *fpc;
fpc=fopen("testing.txt","r");
fscanf(fpc,"%d",&test);
int i;
for(i=0;i<test;i++)
{
int j;
for(j=0;j<5;j++)
{
fscanf(fpc,"%d",&A[j]);
AD[j]=&A[j];
printf("%d ",AD[j]);
}
puts("");
row1(AD[0]);
}
}
void row1 (int AD[0])
{
int I[5];
int i;
for(i=0;i<5;i++)
{
I[i]=AD[i];
AD[i]=AD[i]+1;
printf("%d, ",I[i]);
}
puts("");
puts("");
puts("");
puts("");
}
如果要传递一个指针数组,则函数声明及其调用将类似于
void row1 (int *AD[] );
//...
row1( AD );
考虑到必须在调用函数之前声明该函数。
至于功能本身,则不清楚您要在功能内实现什么。
同样因为数组AD是指针数组,所以您应该在printf函数中使用格式说明符%p
printf("%p ",AD[j]);
声明...
int *AD[5];
...声明AD
为五个指向int
指针的数组。 您可以使用指向A
的相应成员的指针来初始化每个成员(这看起来很浪费,但是不管用什么)。
您稍后执行此调用:
row1(AD[0]);
很好:它将AD
的第一个元素传递给函数。 由于AD[0]
是指向A[0]
的指针,所以它们等效于以下任意一个:
row1(&A[0]);
/* or */
row1(A);
特别要注意后者。
现在,函数row()
的声明如下:
void row1 (int AD[0])
这似乎将函数参数AD
声明为一个零个int
s的数组,这将是无效的,但实际上,函数参数声明中的数组长度会被忽略。 该声明等效于以下任何一个:
void row1 (int AD[])
/* or */
void row1 (int *AD)
这是与你逝去的说法一致,但要注意, AD
的功能row1()
是区别于AD
中main()
他们有不同的和不兼容的类型 。
在功能row1()
您有...
I[i]=AD[i];
...您将值由指针指向 AD + i
。 设置方式的方式,可以得出可以在main()
表示为A[i]
的值。
如果确实要打印指针本身的表示形式,则可以在row1()
这样做,如下所示:
int i;
for (i = 0; i < 5; i++) {
printf("%p, ", AD++);
}
请注意,它是指针本身被打印,而不是它所指的东西。 还请注意,这取决于它的正确性,取决于main()
初始化(其) AD
。
另外,您可以像这样重写row1()
:
void row1 (int *AD[])
{
int i;
for(i = 0; i < 5; i++)
{
printf("%p, ", AD[i]);
}
}
然后从main()
调用它,如下所示:
row1(AD);
请注意,您传递的是整个数组,而不仅仅是单个元素。 如果您不能依靠main()
的AD
成员作为指向数组中连续成员的指针,那是唯一的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.