鱼C论坛

 找回密码
 立即注册
查看: 1736|回复: 7

[已解决]C语言关于指针以及函数的传值运算这一块

[复制链接]
发表于 2019-2-3 12:30:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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的值也发生了改变。
我记得传值运算,如果传的是地址那么就是双向的,如果传的是数值那么就是单向的对吧??希望好心人能够详细地讲一讲,在这里谢谢大家!!



最佳答案
2019-2-3 16:00:04
哈哈哈的 发表于 2019-2-3 15:20
#include
int k=5;
void f(int *p)

这个是因为在进入f()函数时  看注释
void f(int *p)             //进入函数时 主函数的p将地址传给了f函数里的p 也就是相当于在
{                              //p=&k;之前 有一个p=p; 然后又有p=&k;其实主函数的p指向的地址并未发生改变
        p=&k;          //你可以自己单步调试看一下 给f函数的p改成p1 然后查看&p,&p1,&m,&k;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-2-3 13:15:24 | 显示全部楼层
void f(int *s)
{
        *s=k;         //这里是将k的值给*s 此时指针s的地址依然指向m;如果改成*s=&k; 指针s指向的地址才会改变;
}

void f(int  *s)
{   s=&k;                   //这道题,这里把指针s的指向地址改变了,指向k的地址;
   *s=7;                   //这里再把7付给指针s相当于赋给k;所以m不变,k为7;
}

两道题的区别是前者指针指向的地址没变,所以m随指针s的值改变而改变;后者指针在函数里不在指向m了,所以m不会发生改变;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-3 14:33:05 | 显示全部楼层
82457097 发表于 2019-2-3 13:15
void f(int *s)
{
        *s=k;         //这里是将k的值给*s 此时指针s的地址依然指向m;如果改成*s=&k ...

#include<stdio.h>
int k=5;
void f(int *p)
{
        p=&k;
}
void main()
{
        int m=3,*p=&m;
        f(p);
        printf("%d,%d",m,*p);
}


#include<stdio.h>
int k=5;
void f(int *p)
{
        *p=k;
}
void main()
{
        int m=3,*p=&m;
        f(p);
        printf("%d,%d",m,*p);
}


请问这两个输出结果为什么不同??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-3 14:53:48 | 显示全部楼层
哈哈哈的 发表于 2019-2-3 14:33
#include
int k=5;
void f(int *p)

还是和我上面说的一样啊 *p=k 只是给指针所指的地址赋一个值 而p=&k 却是让指针指向一个新的地址
指针是活动的 而m的地址和值却是绑定的 如果指针指向m的地址 那么指针得到新的值 指针指向的地址所绑定的变量也就是m的值就会随之改变了 但如果指针指向的地址改变了 那么这个指针就和原来的地址所绑定的一切都没有任何关系了

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-3 15:20:57 | 显示全部楼层
82457097 发表于 2019-2-3 14:53
还是和我上面说的一样啊 *p=k 只是给指针所指的地址赋一个值 而p=&k 却是让指针指向一个新的地址
指针是 ...

#include<stdio.h>
int k=5;
void f(int *p)
{
        p=&k;
}
void main()
{
        int m=3,*p=&m;
        f(p);
        printf("%d,%d",m,*p);
}
这个*P输出的结果为什么是3呢?p指向k的地址,输出结果应该是5啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-3 16:00:04 | 显示全部楼层    本楼为最佳答案   
哈哈哈的 发表于 2019-2-3 15:20
#include
int k=5;
void f(int *p)

这个是因为在进入f()函数时  看注释
void f(int *p)             //进入函数时 主函数的p将地址传给了f函数里的p 也就是相当于在
{                              //p=&k;之前 有一个p=p; 然后又有p=&k;其实主函数的p指向的地址并未发生改变
        p=&k;          //你可以自己单步调试看一下 给f函数的p改成p1 然后查看&p,&p1,&m,&k;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-3 16:17:23 | 显示全部楼层
本帖最后由 jackz007 于 2019-2-3 16:23 编辑

        在计算机中,对变量的赋值、修改实际上就是通过改变该变量所占用的内存单元的内容来实现的,本题就是一个生动的体现。

        由于指针 p 指向了变量 m,那么 * p 便就是变量 m 本身(注意:不是相等),于是,修改 * p 就是修改 m,为 * p 赋值就是为 m 赋值。

        函数 f() 的作用是把外部(全局)变量 k 的值赋给输入参数所指向的内存地址单元,由于输入参数指向了变量 m,于是,函数 f() 所完成的操作实际上就是直接修改变量 m 的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-2-5 19:21:53 | 显示全部楼层
jackz007 发表于 2019-2-3 16:17
在计算机中,对变量的赋值、修改实际上就是通过改变该变量所占用的内存单元的内容来实现的,本题就 ...

谢谢普及教育!!感激
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 08:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表