[资料干货] c语言指针的地址传递

[复制链接]
2030|18
 楼主| Toughguy98 发表于 2019-9-18 20:57 | 显示全部楼层 |阅读模式
#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)
zyj9490 发表于 2019-9-18 22:40 | 显示全部楼层
函数执行时,先s=p;t=q;后面跟p,q没有关糸了。
R2D2 发表于 2019-9-18 23:02 | 显示全部楼层
  1. int *f(int **s,int **t)
  2. {
  3.         if(**s<**t)
  4.         {
  5.                 *s = *t;
  6.         }
  7.         return *s;
  8. }

  9. r = f (&p,&q);
zchong 发表于 2019-9-19 07:53 来自手机 | 显示全部楼层
形参的基本概念
zchong 发表于 2019-9-19 07:54 来自手机 | 显示全部楼层
不能因为形参是个指针变量就迷糊了
1203030117 发表于 2019-9-19 16:55 | 显示全部楼层
楼上说的对,指针作为形参没整明白,,,这一顿操作下来,*p指向的地址没变,*q指向的地址没变,只是把*r指向了*p和*q中变量值较大的那个地址,,,
zhangmangui 发表于 2019-9-19 22:02 | 显示全部楼层
指针我也是糊里糊涂   需要好好学习
cooldog123pp 发表于 2019-9-20 09:17 | 显示全部楼层
看的我头大啊,写程序的时候尽量少用 这么绕的,用了也要注释清楚,整明白了以后就拿来用就行了,指针瑟瑟发抖。
tree844 发表于 2019-9-20 10:24 | 显示全部楼层
1203030117 发表于 2019-9-19 16:55
楼上说的对,指针作为形参没整明白,,,这一顿操作下来,*p指向的地址没变,*q指向的地址没变,只是把*r指 ...

请问:
s = t;
这个语句,不是把t的地址赋给了s吗?
七颗咖啡豆 发表于 2019-9-20 10:58 | 显示全部楼层
tree844 发表于 2019-9-20 10:24
请问:
s = t;
这个语句,不是把t的地址赋给了s吗?

是的,但是s不是p,所以p还是原来那个p
tree844 发表于 2019-9-20 11:15 | 显示全部楼层
七颗咖啡豆 发表于 2019-9-20 10:58
是的,但是s不是p,所以p还是原来那个p

也就是说,函数里的形参,得到了p和q的值,用得到的值进行计算;而p和q本身没有参与计算。是这样理解吗?
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,这个是没有变的,,,这就是针对这个帖子来这样理解的,这里只是改变了指针指向的地址,而没有改变指针指向地址里面的值。
      不要用变量的理解方式去理解指针,,指针可以当做是一个非常灵活的工具,它能跳过这些上层结构框架什么的,直接指向电脑里的内存地址,然后获取到内存里面的值或者改变里面的值。。。
      可能做单片机应用程序这块的大部分人都体会不到指针的便利之处,因为本身操作的就是底层了,所以用的也就少了,,,但是在系统层面指针就能体现出方便了,嗯,这些东西以后都会理解的
      
R2D2 发表于 2019-9-20 18:29 | 显示全部楼层
tree844 发表于 2019-9-20 10:24
请问:
s = t;
这个语句,不是把t的地址赋给了s吗?

看《数据结构》堆栈和递归那部分,s、t都是在堆栈里面临时生成的局部变量,函数退出就扔掉了。除了s作为函数值返回以外,s、t的本体在退出时就扔掉了。
七颗咖啡豆 发表于 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
刚才整理的
雪山飞狐D 发表于 2019-9-21 13:54 | 显示全部楼层
本帖最后由 雪山飞狐D 于 2019-9-21 14:07 编辑

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

本帖子中包含更多资源

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

×
zchong 发表于 2019-9-22 09:16 | 显示全部楼层
本帖最后由 zchong 于 2019-9-22 09:18 编辑
1203030117 发表于 2019-9-20 17:05
,,,嗯嗯,你这样说,我也不知道你有没有理解,,,
      变量 和 指针 的理解,变量是多少就是多少, ...

我怎么觉得楼上那位理解没啥问题,你的理解是有问题的呢
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

16

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部