#include<stdio.h>
int i = 10;
void func(int *q){
q = &i;
}
int main(void){
int i = 20;
int *p = &i;
printf("%d\n",*p);
func(p);
printf("%d",*p);
return 0;
}
这里第二个printf语句中p的值应该是10 ......但是当我执行它时返回20怎么回事?
答案 0 :(得分:2)
如果你这样做会打印10
*q = i
在被调用函数中。
在本地变量q
中的被调用函数中更改其地址与您一起的变量的内容。请勿更改局部变量q
的内容。
这是调用函数并打印值时发生的情况。那么这不是一个详尽的清单,但是这指出了在这种背景下有用的关键事项。
您在i
中获得了变量p
的地址。
然后将其传递给被调用函数。
被叫函数现在有一个局部变量,其内容与p
的内容相同。
现在,您使用全局变量i
的地址更改本地变量的内容。
然后功能结束。
安息吧 - 本地变量q
。它死了。
然后您再次访问*p
中的main()
- 这意味着您要查找p
中包含的地址中的值。
你得到20
。
10
吗?好吧有
func(&p);
然后你这样做
void func(int **q){
*q = &i;
}
现在您打印*p
,您将获得10
。
无论 C
是通过值传递,清楚地了解一些事情。即使在这里,q
也是一个局部变量。但现在我们的地址为p
main()
在q
。因此,当您编写*q=&i
时,您基本上会从p
转到main()
的地址,然后在那里写下全局变量i
的地址。然后你回来了。 q
再次丢失。然后打印 - 当您更改为原始变量(p
)时,其中的内容为10
。
func(p);
然后在func()
void func(int *q){
*q = i;
}
func(&p);
然后在func()
void func(int **q){
*q = &i;
}
答案 1 :(得分:2)
下面
q = &i
您正在设置q
的值,这是一个局部变量。更改它 not 更改传递给func()
的变量的值。
要对printf()
打印10
进行第二次调用,您需要写入q
指向的位置。
*q = i;
q
指向内部i
,这种方式设置为10
。
答案 2 :(得分:0)
调用这里第二个printf语句中p的值应该是10(已更改)...但是当我执行它时返回20(与原始相同)。
怎么样和为什么?
q
时,void func(int *q)
中的 p
是func(p);
的副本。
void func(int *q){
q = &i;
}
int main(void){
...
func(p);
...
}
q = &i;
内的更改void func(int *q)
不会影响p
中的main()
。