在C语言中,以下代码执行之后,*p的值为()
void func(int *p)
{
static int num = 4;
p = #
(*p)--;
}
int main()
{
int i = 5;
int *p = &i;
func(p);
printf(
"%d"
, *p);
return 0;
}
3
4
5
以上都不是
答案 C 错选 B
在函数里,指针p又重新定位成num的地址空间,所以在函数中的自减是修改num的值;而当在main函数中的p指针依然指向 i 的地址空间,在func中没有被修改,那么值不变;
如果函数去掉num,如下:
void func(int *p){(*p)--;}
此时,就是修改 main函数中 i 的值了。
详细分析:
如上图,当调用函数的时候,形参指针p会指向实参指针p 所指向的地址空间;
在题目的 func 函数中,形参指针p 指向了新的地址空间num,如下图:
那么此时修改形参p 所指向地址空间的值,是不会影响 实参指针p和i 的值。
尽管函数的形参是指针,但是注意,它仍然是“值传递”。
一方面,函数本身没有任何返回;另一方面,函数只是对p的值的处理,并非p的地址。
函数调用时,p作实参,函数中也给p重新赋值,函数确实使静态局部变量num的值减1,但是函数执行完,返回到主函数中,p中的仍然是i的地址。
若要使得p指向num,需要对p的地址进行传递,此时:
void func(int **p)
{
static int num = 4;
*p = #
(**p)--;
}
int main()
{
int i = 5;
int *p = &i;
func(&p);
printf("%d",*p);
return 0;
}
执行结果: