C语言中指针探秘(一)

指针与指针变量

在程序中声明变量后,编译器就会为改变量分配相应的内存单元。也就是说,每个变量在内存中会有相应固定的位置,有具体的地址。由于变量的数据类型不同,它所占的内存单元数也不相同。如下例声明了一些变量和数组。


int i = 18;                     //声明整形变量i并赋值
char c[5] = {89,90,91,92,93};   //声明字符型数组c并初始化
float f = 12.89;                //声明单精度浮点型变量f并赋值
double d = 1.414213;            //声明双精度浮点型变量d并赋值

在程序编译时,编译器讲指定这些变量和数组所需要的存储空间长度。程序运行中,由操作系统为这些变量和数组分配内存单元。整型变量所占用的内存为2字节,长度为5的字符型数组所占用的内存为5字节,单精度浮点型变量所占用的内存为4字节,双精度浮点型所占用的内存为8字节。由于计算机内存是最小的寻址单位是字节,设变量的存放从3000单元开始,则操作系统为这些变量和数组分配内存单元,如图所示。
这里写图片描述
变量在内存中按照数据类型的不同所占内存的大小也不同,每个变量都有具体的内存单元地址,如变量i在内存的地址是3000,占据2个字节后,数据c的内存首地址就为3002,变量f的内存地址为3008等。对内存中变量的访问,过去用”scanf(“%d”,&a)”表达式将数据输入变量的地址所指示的内存单元。那么访问变量首先应找到其内存的地址,或者说,一个地址唯一指向一个内存变量,称这个地址为变量的指针,如果将变量的地址保存在特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针所指向变量的访问,也就是一种对变量的间接访问。
假设一组指针变量pi、pc、pf和pd分别指向上述的变量或数组i、c[]、f和d,指针变量也同样被存放在内存,二者的关系如下。指针变量的存储空间中存放的数据为对应变量或数组的内存地址,通过地址就可以访问对应的变量或数组。
这里写图片描述
图 指针变量与所指向变量的映射关系

指针变量的定义与引用

指针变量时包含内存地址的变量。一般的变量直接包含一个特定的值,而指针变量包含的是某一特定数据类型的内存地址,普通变量直接引用其中的值,普通变量直接引用其中的值,指针变量则间接引用所指向内存地址中的值。指针变量在使用前需要声明和初始化。

指针变量定义时,需要指定所指向的数据类型,声明指针变量的一般形式为:


数据类型  *变量名

“*” 运算符通常称为间接运算符或间接引用运算符,在声明中以这种方式使用间接运算符时,它用以表明的变量是指针变量。如下列源代码所示:


int *pi;    //声明一个整形指针变量
char *pc;   //声明一个字符型指针变量
float *pf;  //声明一个单精度度浮点型指针变量

声明为整形的指针变量*pi只能指向整形变量或者整形变量数组元素。声明为字符型的指针变只能指向字符型数据。指针变量声明后,才可以写入指向某种数据类型的变量的地址,或者说是为指针变量的初始化。如下列源代码所示:

int *pi,i=290;   //声明整型指针变量*pi和整型变量i,并为i赋初值
char *pc,c=65;   //声明字符型指针变量*pc和字符型变量c,并为c赋初值
float *pf,f=1.414;
//声明单精度浮点型指针变量*pf和单精度浮点型变量f,并为f赋初值
pi=&i;           //将整形指针变量*pi指向整型变量i
pc=&c;           //将字符形指针变量*pc指向字符型变量c
pf=&f;           //将单精度浮点型指针变量*pf指向单精度浮点型变量f

上述赋值语句pi=&i表示将变量i的地址赋给指针变量pi,此时pi就指向了i。3条赋值语句产生的效果是pi指向i,pc指向c,pf指向f,如如下图所示。&运算符称为取地址运算符,作用是取得变量的内存地址。
这里写图片描述
利用指针变量可以改变内存中某一单元的值,这是一种对系统底层的访问。指针变量为复杂的操作带来便利的同时,也存在很大的安全隐患,使用不当时极容易引起程序的终止甚至系统死机。利用指针变量间接引用变量的形式为:


*指针变量

间接运算符在这里的作用是访问指针变量所指向的内存单元的值,如下例:

int *pi,i=100;    //声明整型指针变量*pi和整型变量i,并为i赋初值
pi=&i;            //将整型指针变量pi指向整形变量i
*pi++;            //间接访问变量i,使变量i的值自增
printf("%d",i);   //输出i的值

该程序的输出为101,因为指针变量*pi间接引用变量i,修改*pi的值等同于修改变量i的值。如果将代码第4行改为


printf("%d",*pi);   //输出pi的值

该程序的输出还是101,*pi与i的作用是等同的。很多函数都需要取得变量的地址用以修改变量的值,如scanf()函数。在上例中,如果使用指针变量修改i的值,则可以用以下代码来实现。


scanf("%d",pi);     //从键盘输入获取数据,保存在变量i中

这条语句的作用等同于scanf(“%d”,&i),因为指针pi的值为变量i的地址,所以不能使用间接运算符。
C语言有两个指针运算符,分别是取地址运算符与间接引用运算符,这两个运算符都是一元运算符,它们的优先级仅次于一元算术运算符。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值