在我的main()
函数中,我使用for循环初始化数组指针*AD
并将数组A[5]
的地址复制到指针AD[5]
中。当我将此指针AD
传递给函数row1()
并将其所有值(在AD中)分配给I[5]
时,我得到A[5]
的实际值而不是地址。另一方面,当我在AD[5]
中打印main()
指针的值时,我得到了地址。我正在使用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("");
}
答案 0 :(得分:2)
如果要传递指针数组,则函数声明及其调用将类似于
void row1 (int *AD[] );
//...
row1( AD );
考虑到函数必须在调用之前声明。
至于函数本身,那么你不清楚你想在函数中实现什么。
同样由于数组AD是一个指针数组,那么你应该在printf函数中使用格式说明符%p
printf("%p ",AD[j]);
答案 1 :(得分:2)
宣言......
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
的数组,这将是无效的,但事实上,函数参数声明中的数组长度将被忽略。该声明等同于以下任何一种:
void row1 (int AD[])
/* or */
void row1 (int *AD)
这与您传递的参数一致,但请注意函数AD
中的row1()
与AD
中的main()
,不同,并且它们具有不同且不兼容的类型。
在功能row1()
中,你有......
I[i]=AD[i];
...您正在通过指针AD + i
指定指向的值。按照您设置的方式,这可以达到A[i]
中可以表示为main()
的值。
如果您确实要打印指针的表示,那么您可以在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()
的{{1}}成员指向数组上的连续成员,那么这是您唯一的选择。