C语言的本质(10)——指针本质


 

指针,大概是C语言中最难理解的概念之一了。指针这个东西是C语言中的一个基本概念,C99中对于指针的定义是:

1. 指针的类型是derived from其它类型,也就是说指针的类型是由它指向的类型决定的;

2. 指针是一种reference类型,即引用类型;

 

指针这个词出现在高级语言程序设计中,在汇编中,就没有指针这个概念,有的只是地址。计算机的每一个内存单元都是编址的,对内存的访问都是通过地址进行的。高级语言把这些低级的硬件细节隐藏起来,程序处理的数据都存在数据对象里,数据对象在能用其间有特定的存储位置,占据一定的内存单元。由于访问内存需要地址,在高级语言中,就引入指针变量来存储数据对象的地址,进而访问内存。

 

简单来说,指针就是一个整数。计算机中的内存都是编址的,每个地址都有一个符号,就像家庭地址或者IP地址一样。指针,是一个无符号整数(unsigned int,因不致歧义,下简称“整数”),它是一个以当前系统寻址范围为取值范围的整数。声明指针和声明一个无符号整数实质上并没有区别。

 

以地址为值的变量就是指针变量,简称指针。

 

  既然指针中存储的是地址,就要能够对所有的内存单元寻址,也就是说指针的大小是系统寻址范围。

 

  所有指针占的存储一样大,因为它们的值都是地址,通常用一个机器字表示,那么机器字通常就和地址范围大小一致了,数据总线和地址总线宽度在程序设计上最好保持一致。

 

  我们知道32位地址总线能够寻址4GB的地址空间(0~232-1),指针是变量 ,其本身也要占据内存单元,那么在32位系统中,整形int也是32位的。

 

32位系统的寻址能力(地址空间)是4GB(0~232-1),二进制表示长度为32比特,也就是4B。不难验证,在32位系统里,int类型也正好是4B(32-bit)长度,可以取遍上述范围。同理,64位系统取值范围为0~264-1,int类型长度为8B。

 

例证就是程序1得到的答案和程序2的答案一致。

程序1:

#include <stdio.h>
int main(void)
{
   char *pT;
   char t='h';
   pT=&t;
   putchar(*pT);
}


程序2:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

尹成

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

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

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

打赏作者

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

抵扣说明:

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

余额充值