我遇到了关于指针的问题,如下所示。我无法理解为什么以下代码的输出是1000而不是10.有谁可以帮助我如何实现?
#include<stdio.h>
int y;
void main()
{
int x, *px, **ppx;
x = 10;
y = 1000;
px = &x;
ppx = &px;
f3(ppx);
printf("%d", *px);
}
void f3(int **pp)
{
*pp = &y;
}
答案 0 :(得分:5)
本声明:
px = &x;
将x
的地址指定给px
。这句话:
ppx = &px;
将px
的地址指定给ppx
。这句话:
f3(ppx);
将ppx
的值传递给f3
。在f3
中,此声明:
*pp = &y;
将y
的地址指定给pp
指向的地方。 pp
是f3
的参数,在调用中的值为ppx
。
也就是说,pp
是ppx
,其指向px
。由于pp
指向px
,*pp = &y
会将y
的地址放在px
中。
现在px
指向y
。然后这句话:
printf("%d", *px);
打印px
指向的内容,即y
,即1000。
答案 1 :(得分:0)
此声明*pp = &y;
导致打印1000
。在致电f3()
px
之前,x
的地址为px=&x;
但f3()
px
已被修改为y
的地址。
int y;
void f3(int **pp){ /*since you didn't declare functin,
so either declare it or define before main() */
*pp = &y;/* px contains now address of y */
}
int main(){ /* use int main() instead of void main() */
int x,*px,**ppx;
x=10;
y=1000;
px=&x;/* px points to address of x*/
ppx=&px; /* ppx points to address of px */
f3(ppx); /* passing ppx i.e address of px
And in f3() *pp = &y means px got replaced by
address of y */
printf("%d",*px); /* prints value at address of y, not address of x */
return 0;
}
始终使用-Wall
标记编译代码,不要忽略警告。
答案 2 :(得分:0)
您可以通过引用间接通过指针来更改函数中的对象。
例如
#include <stdio.h>
void f( int *p, int value )
{
*p = value;
}
int main(void)
{
int x = 10;
printf( "Before call f x = %d\n", x );
int *px = &x;
f( px, 20 );
printf( "After call f x = %d\n", x );
return 0;
}
程序输出
Before call f x = 10
After call f x = 20
在程序中,该函数处理指向main中声明的变量x
的指针。这是指针指向变量x
。取消引用指针,您可以访问变量,从而可以更改它。
*p = 20;
与更改具有指针类型的对象的方法相同。要做到这一点,你必须通过引用传递对象/指针,如上所示。
例如
#include <stdio.h>
typedef int * T;
void f( T *pp, T p )
{
*pp = p;
}
int main(void)
{
int x = 10;
T px = NULL;
T *ppx = &px;
f( ppx, &x );
printf( "After call f *px = %d\n", *px );
return 0;
}
程序输出
After call f *px = 10
在程序开始时,具有px
类型的指针int *
(由于typedef)由NULL
初始化。然后通过引用将其传递给函数f
T *ppx = &px;
f( ppx, &x );
通过指向指针px
的指针是直接的。在函数内,通过取消引用指向原始指针px
的指针x
,将指针pp
与变量px
的地址重新分配。