使用按引用调用打印数组的元素

时间:2017-09-28 20:53:21

标签: c function pass-by-reference

show()的目的只是显示数组的元素。我的代码出了什么问题?我的理解是我们将各个元素的地址作为参数传递给display(),然后将" x"(存储元素的地址)的地址传递给show()。请帮忙!

#include <stdio.h>

void disp(int *);
void show(int *);
int main()
{
    int i;
    int marks[] = {55,65,89,78,74,77,45};
    for(i=0;i<=6;i++)
    {
        disp(&marks[i]);
        printf("%d \n", (&marks[i]));
    }


        return 0;
}
void disp(int *x)
{
    show(&x);

}

void show(int *n)
{  printf("%d\n", *(*n));


}

4 个答案:

答案 0 :(得分:1)

当您在show(&x)中调用disp()时,您将传入指向int的指针(因为x是指向int的指针),即使show()只接受指向int的指针。

您应该将show()中的参数从int *n更改为int **n以解决此问题。

答案 1 :(得分:1)

嗯,你几乎做对了。您的disp函数需要一个地址,因此当您在其中调用show时,不应使用&符号,因为它已经是一个地址。然后在函数show上,您应该只使用*n代替*(*n)

答案 2 :(得分:1)

可能这比你在那里尝试的更容易:

#include <stdio.h>

#define ArrSIZE 7

void disp(int *);
void show(int *);

int main(void)
{
    int i;
    int marks[] = {55,65,89,78,74,77,45};

    for( i=0 ; i < ArrSIZE ; i++ )
    {
        disp(&marks[i]);
        printf("%p\n", (void*)&marks[i]);
    }

    return 0;
}

void disp(int *x)
{
    show(x);

}

void show(int *n)
{
    printf("%d\n", *n);
}

但是,如果你坚持以这种方式做,那么这就是你应该做的:

#include <stdio.h>

#define ArrSIZE 7

void disp(int *);
void show(int **);

int main(void)
{
    int i;
    int marks[] = {55,65,89,78,74,77,45};

    for( i=0 ; i < ArrSIZE ; i++ )
    {
        disp(&marks[i]);
        printf("%p\n", (void*)&marks[i]);
    }

    return 0;
}

void disp(int *x)
{
    show(&x);

}

void show(int **n)
{
    printf("%d\n", **n);
}

void show(int **n)内部,你需要一个指向指针才能工作并删除n周围的括号。

就像我在评论中所说,如果你需要打印地址,你需要正确的说明符,即%p并将其转换为(void *)。

无论如何都会输出这个:

55
0xffefffec0
65
0xffefffec4
89
0xffefffec8
78
0xffefffecc
74
0xffefffed0
77
0xffefffed4
45
0xffefffed8

答案 3 :(得分:1)

对于根据C标准的初学者,不带参数的函数main应声明为

int main( void )

其次不要使用魔术数字。它们通常是众多错误的来源。最好写

size_t i;
int marks[] = { 55, 65, 89, 78, 74, 77, 45 };
const size_t N = sizeof( marks ) / sizeof( *marks );

for ( i = 0; i < N; i++ )
{
    //...

在本声明中

printf("%d \n", (&marks[i]));

你试图输出一个指针(如果你确实想输出指针)作为int类型的对象,导致未定义的行为。

必须有

printf( "%p\n", ( void * )&marks[i] );
  

我的理解是我们将各个元素的地址作为   display()的参数然后传递&#34; x&#34;的地址   将元素的地址存储到show()。

在这种情况下,函数show应该声明为

void show(int **);
              ^^^

并定义为

void show( int **n )
{  
    printf( "%d\n", **n );
}