将数组指针传递给C中的函数

时间:2015-05-06 17:36:15

标签: c arrays function pointers

在我的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("");
}

2 个答案:

答案 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}}成员指向数组上的连续成员,那么这是您唯一的选择。