设为首页 加入收藏

TOP

C语言中指针探秘
2017-06-20 10:22:39 】 浏览:9700
Tags:言中 指针 探秘

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,如如下图所示。&运算符称为取地址运算符,作用是取得变量的内存地址。
这里写图片描述vc6qOiA8L2NvZGU+PC9jb2RlPjwvY29kZT48L3A+DQo8cHJlIGNsYXNzPQ=="brush:java;"> *指针变量

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

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语言有两个指针运算符,分别是取地址运算符与间接引用运算符,这两个运算符都是一元运算符,它们的优先级仅次于一元算术运算符。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇51nod 1102 面积最大的矩形(单调.. 下一篇程序开发面试题

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目