鱼C论坛

 找回密码
 立即注册
查看: 1779|回复: 15

关于指针地址长度问题

[复制链接]
发表于 2022-4-9 17:15:02 | 显示全部楼层 |阅读模式

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

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

x
代码与运行结果如下图:
#include <stdio.h>
int main(void){
        char a = 'F';
        int f = 123;
        char *pa = &a;
        int *pf = &f;

        printf("a = %c\n", *pa);
        printf("f = %d\n", *pf);

        *pa = 'c';
        *pf += 1;

        printf("now, a = %c\n", *pa);
        printf("now, f = %d\n", *pf);

        printf("sizeof pa = %d\n", sizeof(pa));
        printf("sizeof pf = %d\n", sizeof(pf));

        printf("the addr of a is: %p\n", pa);
        printf("the addr of f is: %p\n", pf);

        return 0;
}

                               
登录/注册后可看大图


为什么指针地址长度是8字节,打印出来的地址只有6字节呢?


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-4-9 18:14:53 | 显示全部楼层
a = F
f = 123
now, a = c
now, f = 124
sizeof pa = 8
sizeof pf = 8
the addr of a is: 000000a68e5ffe0f
the addr of f is: 000000a68e5ffe08
这个就是实际的内存地址,长度是 8 个字节,并非 6 个字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-9 18:20:09 | 显示全部楼层
jackz007 发表于 2022-4-9 18:14
这个就是实际的内存地址,长度是 8 个字节,并非 6 个字节。
a = F
f = 123
now, a = c
now, f = 124
sizeof pa = 8
sizeof pf = 8
the addr of a is: 0x7ffe1018c9bf
the addr of f is: 0x7ffe1018c9b8

我的运行结果是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-9 19:32:16 | 显示全部楼层
风车呼呼呼 发表于 2022-4-9 18:20
我的运行结果是这样的

    那是因为没有显示十六进制的前导 0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 13:08:43 | 显示全部楼层
jackz007 发表于 2022-4-9 19:32
那是因为没有显示十六进制的前导 0。

我记得%x才会前面省略前导0吧,%p应该是完全显示的
那有什么办法能让它显示出来呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 14:24:05 From FishC Mobile | 显示全部楼层
你用的什么编译器,%p是会显示0x的,你那没显示可能是编译器的问题。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 14:50:33 | 显示全部楼层
zzxhh628 发表于 2022-4-10 14:24
你用的什么编译器,%p是会显示0x的,你那没显示可能是编译器的问题。

gcc编译的,0x显示了,是长度不到8字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:09:02 From FishC Mobile | 显示全部楼层
你输出的值是什么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 15:13:47 | 显示全部楼层
zzxhh628 发表于 2022-4-10 15:09
你输出的值是什么?
a = F
f = 123
now, a = c
now, f = 124
sizeof pa = 8
sizeof pf = 8
the addr of a is: 0x7ffe1018c9bf
the addr of f is: 0x7ffe1018c9b8
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:15:45 From FishC Mobile | 显示全部楼层
这都超过8字节了吧?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 15:17:58 | 显示全部楼层
zzxhh628 发表于 2022-4-10 15:15
这都超过8字节了吧?

这难道不是6字节吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:20:55 From FishC Mobile | 显示全部楼层
一个字符应该是一字节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:27:58 | 显示全部楼层
建议修改格式化符号(即在%p改为%#p):
printf("the addr of a is: %#p\n", pa);
printf("the addr of f is: %#p\n", pf);
希望能帮到你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 15:34:27 | 显示全部楼层
zzxhh628 发表于 2022-4-10 15:20
一个字符应该是一字节。

不是哦,上面sizeof已经求得是占8字节,内容输出是十六进制,1位4比特,2位1字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-10 15:40:44 | 显示全部楼层
cjgank 发表于 2022-4-10 15:27
建议修改格式化符号(即在%p改为%#p):
printf("the addr of a is: %#p\n", pa);
printf("the addr of f ...

运行了一下,还是没变化
不过加上#是起什么作用的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-10 15:51:56 | 显示全部楼层
风车呼呼呼 发表于 2022-4-10 15:40
运行了一下,还是没变化
不过加上#是起什么作用的呢?

输入16进制前缀0x
the addr of a is: 0X0061FF17
the addr of f is: 0X0061FF10
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-5 18:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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