鱼C论坛

 找回密码
 立即注册
查看: 2405|回复: 12

关于c的函数

[复制链接]
发表于 2014-5-28 13:59:19 | 显示全部楼层 |阅读模式
1鱼币
本帖最后由 Road_7 于 2014-5-28 14:02 编辑
#include <stdio.h>

void fu(int *p, int *q)
{
        p = p + 2;
        *q = *q + 1;

}

int main()
{
        int m = 1, c = 7,n = 2, *r = &m;
        fu(r, &n);
        printf("%d %d", *r, c);
        return 0;
}

最佳答案

查看完整内容

你还是没有理解指针。 首先要知道,你的r也是个变量。r和fu函数中的p,都是变量,他们是两个变量! 他们可以同时指向同一个地址,也可以指向不同地址,对p指向地址做修改,不会对r产生影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 13:59:20 | 显示全部楼层
你还是没有理解指针。
首先要知道,你的r也是个变量。r和fu函数中的p,都是变量,他们是两个变量!
他们可以同时指向同一个地址,也可以指向不同地址,对p指向地址做修改,不会对r产生影响
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-28 14:03:01 | 显示全部楼层
为什么函数返回的时候,r的地址没有改变,我不是引用调用, 对r 的地址加二了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 14:44:25 | 显示全部楼层
因为r也是个变量,也在内存中占有地址。所以你可以声明一个二级指针,int **pr,指向r,此时通过pr就可以修改r的值了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 15:23:34 | 显示全部楼层
楼上大神正解!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-28 16:39:36 | 显示全部楼层

好像是懂了,谢大神指点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-28 16:56:51 | 显示全部楼层
vvqboy 发表于 2014-5-28 14:44
因为r也是个变量,也在内存中占有地址。所以你可以声明一个二级指针,int **pr,指向r,此时通过pr就可以修改 ...

我刚才试了一下你的方法,能否在fu函数中改掉r的地址呢,一下是我的代码(没改掉r)
#include <stdio.h>

void fu(int *p, int *q)
{
        int **ptr =& p;
        *ptr +=  2;
        *q = *q + 1;

}

int main()
{
        int m = 1, c = 7,n = 2, *r = &m;
        fu(r, &n);
        printf("%d %d", *r, c);
        return 0;
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 17:37:25 | 显示全部楼层
Road_7 发表于 2014-5-28 16:56
我刚才试了一下你的方法,能否在fu函数中改掉r的地址呢,一下是我的代码(没改掉r)

唉,我直接给你代码吧
#include <stdio.h>

void fu(int **p, int *q)
{
        *p +=  2;
        *q = *q + 1;

}

int main()
{
        int m = 1, c = 7,n = 2, *r = &m;
        fu(&r, &n);
        printf("%d %d", *r, c);
        return 0;
}
上面代码执行后,r的值加了8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 17:39:21 | 显示全部楼层
Road_7 发表于 2014-5-28 16:56
我刚才试了一下你的方法,能否在fu函数中改掉r的地址呢,一下是我的代码(没改掉r)

你的  int **ptr =& p;
通过ptr,只能改变p的值,对r没有任何影响的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-5-28 18:31:12 | 显示全部楼层
vvqboy 发表于 2014-5-28 17:37
唉,我直接给你代码吧
上面代码执行后,r的值加了8

谢大神,啦啦啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-5-28 20:02:21 | 显示全部楼层
Road_7 发表于 2014-5-28 18:31
谢大神,啦啦啦

形参跟实参的数据类型不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-6-3 20:20:37 | 显示全部楼层
要深刻理解传值调用和传址调用,多看几遍书吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-6-3 22:13:22 | 显示全部楼层
其实我在学汇编了,我也是高逆向的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-24 10:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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