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));
}
答案 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 );
}