| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
x
 
有两个题: 
 
 
#include<stdio.h> 
int k=5; 
void f(int *s) 
{ 
        *s=k; 
} 
void main() 
{ 
        int m=3,*p=&m; 
        f(p); 
        printf("%d,%d",m,*p); 
} 
这一题的答案是5,5. 为什么m的值会从3变成5? 指针p开始指向m的地址,通过函数f使得指针p指向k的地址。所以最后输出的*p值为5.p指针指向的地址改变了,m的值也会改变??为什么? 
 
 
 
 
第二题类似,是我在百度上看到的: 
有以下程序 
#include  <stdio.h> 
int  k=5; 
void f(int  *s) 
{   s=&k; 
   *s=7; 
} 
main( ) 
{  int  m=3;   
  f(&m);   
  printf("%d,%d\n", m, k);  
} 
程序运行后的输出结果是(  )。 
A 
3,7 
B 
7,7 
C 
5,7 
D 
3,5 
【答案】 
A 
【解析】 
本题中s得到的是k的地址,而s的内容为7,所以k的值就变成了7,而题目中m的地址并没有发生变化,从而m的值依然为3。 
 
为什么解析说m的地址没有发生改变?如果类似上题的思路,通过函数f,m的地址应该发生改变,所以最后输出来m的值也发生了改变。 
我记得传值运算,如果传的是地址那么就是双向的,如果传的是数值那么就是单向的对吧??希望好心人能够详细地讲一讲,在这里谢谢大家!! 
 
 
 
这个是因为在进入f()函数时  看注释 
void f(int *p)             //进入函数时 主函数的p将地址传给了f函数里的p 也就是相当于在 
{                              //p=&k;之前 有一个p=p; 然后又有p=&k; 其实主函数的p指向的地址并未发生改变 
        p=&k;          //你可以自己单步调试看一下 给f函数的p改成p1 然后查看&p,&p1,&m,&k; 
}  
 
 
 |   
 
 
 
 |