打印
[资料干货]

c语言指针的地址传递

[复制链接]
1703|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
#include "stdio.h"

int *f(int *s,int *t)
{
        if(*s<*t)
        {
                s = t;
        }
        return s;
}

int main()
{
        int i=3,j=5,*p=&i,*q=&j,*r;
        r = (p,q);
        printf("%d,%d,%d,%d,%d\n",i,j,*p,*q,*r);
} 这段程序执行完为什么*p的值是3而不是5呢?求大佬解答,感激不尽

使用特权

评论回复

相关帖子

沙发
R2D2| | 2019-9-18 22:05 | 只看该作者
r = (p,q); 改成 p = (p,q);不就完了吗?

使用特权

评论回复
板凳
zyj9490| | 2019-9-18 22:23 | 只看该作者
P的内容一直没有改变过,函数传递的是指针形参,而非p变量。

使用特权

评论回复
地板
zyj9490| | 2019-9-18 22:30 | 只看该作者
int **f(int **s,int**t)

使用特权

评论回复
5
zyj9490| | 2019-9-18 22:40 | 只看该作者
函数执行时,先s=p;t=q;后面跟p,q没有关糸了。

使用特权

评论回复
6
R2D2| | 2019-9-18 23:02 | 只看该作者
int *f(int **s,int **t)
{
        if(**s<**t)
        {
                *s = *t;
        }
        return *s;
}

r = f (&p,&q);

使用特权

评论回复
7
zchong| | 2019-9-19 07:53 | 只看该作者
形参的基本概念

使用特权

评论回复
8
zchong| | 2019-9-19 07:54 | 只看该作者
不能因为形参是个指针变量就迷糊了

使用特权

评论回复
9
1203030117| | 2019-9-19 16:55 | 只看该作者
楼上说的对,指针作为形参没整明白,,,这一顿操作下来,*p指向的地址没变,*q指向的地址没变,只是把*r指向了*p和*q中变量值较大的那个地址,,,

使用特权

评论回复
10
zhangmangui| | 2019-9-19 22:02 | 只看该作者
指针我也是糊里糊涂   需要好好学习

使用特权

评论回复
11
cooldog123pp| | 2019-9-20 09:17 | 只看该作者
看的我头大啊,写程序的时候尽量少用 这么绕的,用了也要注释清楚,整明白了以后就拿来用就行了,指针瑟瑟发抖。

使用特权

评论回复
12
tree844| | 2019-9-20 10:24 | 只看该作者
1203030117 发表于 2019-9-19 16:55
楼上说的对,指针作为形参没整明白,,,这一顿操作下来,*p指向的地址没变,*q指向的地址没变,只是把*r指 ...

请问:
s = t;
这个语句,不是把t的地址赋给了s吗?

使用特权

评论回复
13
七颗咖啡豆| | 2019-9-20 10:58 | 只看该作者
tree844 发表于 2019-9-20 10:24
请问:
s = t;
这个语句,不是把t的地址赋给了s吗?

是的,但是s不是p,所以p还是原来那个p

使用特权

评论回复
14
tree844| | 2019-9-20 11:15 | 只看该作者
七颗咖啡豆 发表于 2019-9-20 10:58
是的,但是s不是p,所以p还是原来那个p

也就是说,函数里的形参,得到了p和q的值,用得到的值进行计算;而p和q本身没有参与计算。是这样理解吗?

使用特权

评论回复
15
1203030117| | 2019-9-20 17:05 | 只看该作者
tree844 发表于 2019-9-20 11:15
也就是说,函数里的形参,得到了p和q的值,用得到的值进行计算;而p和q本身没有参与计算。是这样理解吗? ...

,,,嗯嗯,你这样说,我也不知道你有没有理解,,,
      变量 和 指针 的理解,变量是多少就是多少,指针是个特殊的东西,它是指向某个数值所存储的地址,指针是没法参与计算的,是指针指向的这个地址的数值去参加计算,,,
      如果定义一个变量等于b=3;那b就是3,3就是b,存在同一个地址。而用指针处理的话,指针指向的是一个地址,它只能指向数值3所存储的地址,然后你改变指针指向的地址之后,那指针指向的就不是数值3的这个地址了,虽然指针变了,但是数值3这个地址存储的值还是数值3,这个是没有变的,,,这就是针对这个帖子来这样理解的,这里只是改变了指针指向的地址,而没有改变指针指向地址里面的值。
      不要用变量的理解方式去理解指针,,指针可以当做是一个非常灵活的工具,它能跳过这些上层结构框架什么的,直接指向电脑里的内存地址,然后获取到内存里面的值或者改变里面的值。。。
      可能做单片机应用程序这块的大部分人都体会不到指针的便利之处,因为本身操作的就是底层了,所以用的也就少了,,,但是在系统层面指针就能体现出方便了,嗯,这些东西以后都会理解的
      

使用特权

评论回复
16
R2D2| | 2019-9-20 18:29 | 只看该作者
tree844 发表于 2019-9-20 10:24
请问:
s = t;
这个语句,不是把t的地址赋给了s吗?

看《数据结构》堆栈和递归那部分,s、t都是在堆栈里面临时生成的局部变量,函数退出就扔掉了。除了s作为函数值返回以外,s、t的本体在退出时就扔掉了。

使用特权

评论回复
17
七颗咖啡豆| | 2019-9-21 10:35 | 只看该作者
本帖最后由 七颗咖啡豆 于 2019-9-21 14:58 编辑
tree844 发表于 2019-9-20 11:15
也就是说,函数里的形参,得到了p和q的值,用得到的值进行计算;而p和q本身没有参与计算。是这样理解吗? ...


别纠结啥形参实参,透过现象看本质。当前IC架构说白了最后都是内存的游戏

https://blog.csdn.net/suxingtian/article/details/101100373
刚才整理的

使用特权

评论回复
18
雪山飞狐D| | 2019-9-21 13:54 | 只看该作者
本帖最后由 雪山飞狐D 于 2019-9-21 14:07 编辑

     全局变量由编译器统一安排在一个区块地址,函数参数入口其实会被压进函数栈中,在内存另外一个地址或者被编译器优化成放到CPU寄存器,p,q只是原来的复制品,地址位置不一样

IMG_0018.jpg (310.71 KB )

IMG_0018.jpg

使用特权

评论回复
19
zchong| | 2019-9-22 09:16 | 只看该作者
本帖最后由 zchong 于 2019-9-22 09:18 编辑
1203030117 发表于 2019-9-20 17:05
,,,嗯嗯,你这样说,我也不知道你有没有理解,,,
      变量 和 指针 的理解,变量是多少就是多少, ...

我怎么觉得楼上那位理解没啥问题,你的理解是有问题的呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

16

帖子

0

粉丝