小芮爱编程丫 发表于 2020-3-12 18:15:06

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

这是我的代码!
#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会发生改变呢?

qiuyouzhi 发表于 2020-3-12 18:17:49

本帖最后由 qiuyouzhi 于 2020-3-12 18:22 编辑

指针指向的是地址,不是数据啊。。。
再说了,你给p赋了一个新的值,地址不改才怪

小芮爱编程丫 发表于 2020-3-12 18:43:21

qiuyouzhi 发表于 2020-3-12 18:17
指针指向的是地址,不是数据啊。。。
再说了,你给p赋了一个新的值,地址不改才怪

难道不是我赋值改的是p这个地址下的数值吗?

qiuyouzhi 发表于 2020-3-12 18:45:14

小芮爱编程丫 发表于 2020-3-12 18:43
难道不是我赋值改的是p这个地址下的数值吗?

。。。
你得改两次
一次改原变量,一次改指针指向的地址

小芮爱编程丫 发表于 2020-3-12 19:00:38

qiuyouzhi 发表于 2020-3-12 18:45
。。。
你得改两次
一次改原变量,一次改指针指向的地址

不好意思我还是没有明白{:5_100:}
*p=258这句难道不是改变的p地址所指对象的值吗?
p这个地址不是始终都是b这个变量对应地址(拓宽到四个字节)吗?

qiuyouzhi 发表于 2020-3-12 19:02:12

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

不是的,它只会改自己
要不然你真想改*p的时候就蒙了

小芮爱编程丫 发表于 2020-3-12 19:06:48

qiuyouzhi 发表于 2020-3-12 19:02
不是的,它只会改自己
要不然你真想改*p的时候就蒙了

可是*p对应的确是改变了吧,要不后来怎么a=1,b=2了呢?

qiuyouzhi 发表于 2020-3-12 19:09:25

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

哦哦哦,抱歉,说错了
你把char改成int才能看出效果

小芮爱编程丫 发表于 2020-3-12 19:30:49

qiuyouzhi 发表于 2020-3-12 19:09
哦哦哦,抱歉,说错了
你把char改成int才能看出效果

so能不能再说一下p这个地址改变的原因,说了这么多条我更乱了{:5_100:}

845318 发表于 2020-5-18 22:46:26

{:5_109:}插个眼,等待大神降临 解答

人造人 发表于 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了
页: [1]
查看完整版本: 小甲鱼关于《带你学C带你飞》教程第三十九期视频最后一个有趣问题