C语言后记-20 指针和地址之间的关系是什么?

本文探讨了指针和地址的关系,虽然在某些早期语言和特定环境下,指针和整数之间没有明显区别,但在C语言中,由于类型长度和寻址方式的不同,指针与int类型并不等价。8086处理器采用段地址和偏移量来表示物理地址。尽管大部分情况下,不同类型的指针在运行时表现形式相同,但类型信息至关重要,void*类型用于通用指针。直接通过未指定类型的指针取值会导致编译错误,需要强制类型转换。最后强调,即使在运行时看似相同的指针,取值时必须考虑到数据类型的内部表示,否则可能导致错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

**常见的一个疑问是:
归根结底, 指针就是地址, 地址就是内存中被分配的“门牌号”。 所以, 指针类型和 int类型应该是一回事吧!**

实际上, 从某种意义来看, 这种认识也不无道理。

在 C 语言前身的 B 语言中, 指针和整数是没有区别的。 此外, 虽然我们经常使用 printf()和%p 来表示指针, 实际上包括我的运行环境在内, 使用%x 也可以很好地表示地址。 对不太擅长十六进制的人来说, 通过使用%d, 也能利用十进制的方式来确认地址的内容。

很可惜, 这里说的运行环境并不具有普适性。 其实在很多的运行环境中, int 类型和指针类型的长度并不相同, 此外, 由于 Intel 8086 的功能限制, 在直到最近还被广泛使用的 MSDOS 中, 是通过将 16 位的值分成两组来表示 20 位的地址的。

8086 是分段寻址的, 具体来说是指一个物理地址由段地址( segment selector) 与偏移量( offset) 两部分组成, 长度各是 16 位。 其中段地址左移 4 位( 即乘以 16) 与偏移量相加即为物理地址

ANSI C 为我们准备了“可以指向任何类型的指针类型”—— void*类型

**第二个疑问是?
指针就是地址吧。 那么, 指向 int 的指针也好, 指向 double 的指针也好, 它们有什么不一样吗? 有必要去区分它们吗?

在某种意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeAllen嵌入式

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值