鱼C论坛

 找回密码
 立即注册
查看: 1206|回复: 10

[已解决]求助大佬,指针地址问题

[复制链接]
发表于 2020-5-5 14:24:11 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 wht666 于 2020-5-5 14:24 编辑

当我调用addx函数时,传指针,也就是一级指针时,在addx函数中  p  指针确实保存了malloc申请空间返回的地址值,但是为什么在主函数中却还是  NULL 0,函数调用中地址传递不是会改变原来这个变量的值吗,又不是值传递。

但是,当我调用addy函数时,传的是指针的地址,也就是一个二级指针,然后在调用的  函数addy  和  主函数  中,p这个指针和&p这个指针地址(二级指针)都有;和刚刚第一种情况完全不一样。想不懂是为啥???

我一直的理解是地址传递在主函数中也是改变的,因为是在内存中改变了,就像第二个函数addy那样,地址传递不是像值传递那样,复制一份数据到另外一个函数,而是复制地址,然后对地址操作。
我的问题是:调用函数为什么改变不了一级指针的值,也就是地址。而二级指针却可以!!!
求大佬们解答一下,谢谢!!!
4.jpg
#include <stdio.h>
#include <stdlib.h>

typedef struct std
{
    char date;
    struct std *p;

}std;
void addx(std *p)
{
    p=(std *)malloc(sizeof(std));
    printf("addx函数中:%p\n",p);
}
void addy(std **p)
{
    *p=(std *)malloc(sizeof(std));

    printf("(指针本身) addy函数中*p:%p\n\n",*p);
    printf("(指针地址)addy函数中的p:%p\n\n",p);

}


int main(void)
{
    std *p=NULL;
    //一级指针
    addx(p);
    printf(" 主函数中:%p\n",p);
    free(p);
    printf("==========\n");
    //&p,传指针的地址,相当于二级指针
    addy(&p);
    printf("(指针本身)    主函数中p:%p\n\n",p);
    printf("(指针地址)   主函数中&p:%p\n\n",&p);
    free(p);
    printf("==========\n");

    return 0;
}
最佳答案
2020-5-5 15:06:25
本帖最后由 Cool_Breeze 于 2020-5-5 15:25 编辑

void addx(std *p) 相当于 void addx (int a)
void addy(std **p) 相当于 void addy (int &a)
明白不
    addx(p);//这里不是传入的指针,是一个指针的值;
    addy(&p);//取指针变量的地址(显式地传递实参的地址)(这样才能更改它的事实参数);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-5 14:35:47 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

typedef struct std
{
    char date;
    struct std *p;

}std;
std* addx(void)
{
    std* p=(std *)malloc(sizeof(std));
    printf("addx函数中:%p\n",p);
    return p;
}
void addy(std **p)
{
    *p=(std *)malloc(sizeof(std));

    printf("(指针本身) addy函数中*p:%p\n\n",*p);
    printf("(指针地址)addy函数中的p:%p\n\n",p);

}


int main(void)
{
    std *p=NULL;
    //一级指针
    p=addx();
    printf(" 主函数中:%p\n",p);
    free(p);
    printf("==========\n");
    //&p,传指针的地址,相当于二级指针
    addy(&p);
    printf("(指针本身)    主函数中p:%p\n\n",p);
    printf("(指针地址)   主函数中&p:%p\n\n",&p);
    free(p);
    printf("==========\n");

    return 0;
}
addx函数中:00000000002DFC80
 主函数中:00000000002DFC80
==========
(指针本身) addy函数中*p:00000000002DFC80

(指针地址)addy函数中的p:000000000022FE48

(指针本身)    主函数中p:00000000002DFC80

(指针地址)   主函数中&p:000000000022FE48

==========

--------------------------------
Process exited after 0.007449 seconds with return value 0
请按任意键继续. . .
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 14:46:25 | 显示全部楼层

没看懂,大佬可不可以解释一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 14:49:56 | 显示全部楼层

还有就是,我想要理解的是,函数参数传地址,然后改变这个地址的问题。
你这个都变了个意思了,都是在其他函数得到一个地址然后返回。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 14:51:49 | 显示全部楼层
把指针设置为全局变量就好了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 14:54:21 | 显示全部楼层
Cool_Breeze 发表于 2020-5-5 14:51
把指针设置为全局变量就好了!

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

使用道具 举报

发表于 2020-5-5 15:03:25 | 显示全部楼层
#include <stdio.h>
#include <stdlib.h>

typedef struct std
{
    char date;
    struct std *p;

}std;

std *p=NULL;//在这里 

void addx(void)
{
    p=(std *)malloc(sizeof(std));
    printf("addx函数中:%p\n",p);
}
void addy(std **p)
{
    *p=(std *)malloc(sizeof(std));

    printf("(指针本身) addy函数中*p:%p\n\n",*p);
    printf("(指针地址)addy函数中的p:%p\n\n",p);

}


int main(void)
{
    //std *p=NULL;
    //一级指针
    addx();
    printf(" 主函数中:%p\n",p);
    free(p);
    printf("==========\n");
    //&p,传指针的地址,相当于二级指针
    addy(&p);
    printf("(指针本身)    主函数中p:%p\n\n",p);
    printf("(指针地址)   主函数中&p:%p\n\n",&p);
    free(p);
    printf("==========\n");

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

使用道具 举报

发表于 2020-5-5 15:06:25 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Cool_Breeze 于 2020-5-5 15:25 编辑

void addx(std *p) 相当于 void addx (int a)
void addy(std **p) 相当于 void addy (int &a)
明白不
    addx(p);//这里不是传入的指针,是一个指针的值;
    addy(&p);//取指针变量的地址(显式地传递实参的地址)(这样才能更改它的事实参数);
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-5 15:11:12 | 显示全部楼层
本帖最后由 4goodworld 于 2020-5-5 15:12 编辑

问题一:当我调用addx函数时,传指针,也就是一级指针时,在addx函数中  p  指针确实保存了malloc申请空间返回的地址值,但是为什么在主函数中却还是  NULL 0,函数调用中地址传递不是会改变原来这个变量的值吗,又不是值传递。
我感觉你这个问题你的困惑其实在于,指针到底是什么?说白了,指针也是一个变量,或者说也是一种数据类型的变量,
用为了说明指针的用途而常常可见的 swap()  当问你swap(int a,int b),请问,我int aa=1,bb=2,swap(aa,bb),你告诉我aa和bb的值会不会变化?你应该会回答不会变,因为我们传递的是值,而不是地址,同理,对于当前你提问的这个指针而言,你作为参数,传递的是指针的值,这时候这个指针p与aa或者bb有啥差别?数据类型不一样而已
如果按照上面的问题一问答的结论慢慢来推导,似乎你应该可以反应过来,如果要对参数的指针变量进行改变值,那我们需要得到的是“指针”的指针,而 指针的指针 不就是对一级指针取地址,不就是二级指针吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 16:02:28 | 显示全部楼层
Cool_Breeze 发表于 2020-5-5 15:06
void addx(std *p) 相当于 void addx (int a)
void addy(std **p) 相当于 void addy (int &a)
明白不

好的谢谢,我知道我错哪了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-5 16:03:39 | 显示全部楼层
4goodworld 发表于 2020-5-5 15:11
问题一:当我调用addx函数时,传指针,也就是一级指针时,在addx函数中  p  指针确实保存了malloc申请空间 ...

谢谢啦,原来我一直理解错了,指针也是一个变量,只不过是存地址的变量,我一直以为是一个地址,那在函数传递也是复制过去的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-14 01:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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