鱼C论坛

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

小甲鱼关于《带你学C带你飞》教程第三十九期视频最后一个有趣问题

[复制链接]
发表于 2020-3-12 18:15:06 | 显示全部楼层 |阅读模式

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

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

x
这是我的代码!
#include<stdio.h>
int main()
{
        char a=0,b=0;
        int *p=(int *)&b;
        printf("首先\na:%d b:%d\n",a,b);
        printf("a:%p b:%p p:%p\n",&a,&b,p);
       
        *p=258;
        printf("之后\na:%d b:%d\n",a,b);
        printf("a:%p b:%p p:%p\n",&a,&b,p);
       
        return 0;
}
这是我显示的结果!
首先
a:0 b:0
a:000000000062FE17 b:000000000062FE16 p:000000000062FE16
之后
a:1 b:2
a:000000000062FE17 b:000000000062FE16 p:0000000000620000

那么好了!请问各位大神为什么在使*p=258之后,p会发生改变呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-12 18:17:49 | 显示全部楼层
本帖最后由 qiuyouzhi 于 2020-3-12 18:22 编辑

指针指向的是地址,不是数据啊。。。
再说了,你给p赋了一个新的值,地址不改才怪
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 18:43:21 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 18:17
指针指向的是地址,不是数据啊。。。
再说了,你给p赋了一个新的值,地址不改才怪

难道不是我赋值改的是p这个地址下的数值吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 18:45:14 | 显示全部楼层
小芮爱编程丫 发表于 2020-3-12 18:43
难道不是我赋值改的是p这个地址下的数值吗?

。。。
你得改两次
一次改原变量,一次改指针指向的地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 19:00:38 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 18:45
。。。
你得改两次
一次改原变量,一次改指针指向的地址

不好意思我还是没有明白
*p=258这句难道不是改变的p地址所指对象的值吗?
p这个地址不是始终都是b这个变量对应地址(拓宽到四个字节)吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 19:02:12 | 显示全部楼层
小芮爱编程丫 发表于 2020-3-12 19:00
不好意思我还是没有明白
*p=258这句难道不是改变的p地址所指对象的值吗?
p这个地址不是始终 ...

不是的,它只会改自己
要不然你真想改*p的时候就蒙了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 19:06:48 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 19:02
不是的,它只会改自己
要不然你真想改*p的时候就蒙了

可是*p对应的确是改变了吧,要不后来怎么a=1,b=2了呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-12 19:09:25 | 显示全部楼层
小芮爱编程丫 发表于 2020-3-12 19:06
可是*p对应的确是改变了吧,要不后来怎么a=1,b=2了呢?

哦哦哦,抱歉,说错了
你把char改成int才能看出效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-12 19:30:49 | 显示全部楼层
qiuyouzhi 发表于 2020-3-12 19:09
哦哦哦,抱歉,说错了
你把char改成int才能看出效果

so能不能再说一下p这个地址改变的原因,说了这么多条我更乱了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-18 22:46:26 | 显示全部楼层
插个眼,等待大神降临 解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-19 00:51:21 | 显示全部楼层
编译器正好把变量p放在了变量b的后面
#include<stdio.h>
int main()
{
    char a=0,b=0;
    int *p=(int *)&b;
    printf("首先\na:%d b:%d\n",a,b);
    printf("a:%p b:%p p:%p\n",&a,&b,p);

    //*p=258;
    *p=0x12345678;
    printf("之后\na:%d b:%d\n",a,b);
    printf("a:%p b:%p p:%p\n",&a,&b,p);
    return 0;
}
首先
a:0 b:0
a:0xffffcc17 b:0xffffcc16 p:0xffffcc16
之后
a:86 b:120
a:0xffffcc17 b:0xffffcc16 p:0xffff1234

这个1234就是这句导致的
*p=0x12345678;

#include<stdio.h>
int main()
{
    char a=0,b=0;
    int *p=(int *)&b;
    printf("首先\na:%d b:%d\n",a,b);
    printf("a:%p b:%p p:%p\n",&a,&b,p);

    //*p=258;
    *p=0xabcd5678;
    printf("之后\na:%d b:%d\n",a,b);
    printf("a:%p b:%p p:%p\n",&a,&b,p);
    return 0;
}
首先
a:0 b:0
a:0xffffcc17 b:0xffffcc16 p:0xffffcc16
之后
a:86 b:120
a:0xffffcc17 b:0xffffcc16 p:0xffffabcd

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-13 19:42

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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