欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C语言中指针探秘

程序员文章站 2022-11-08 22:33:57
c语言中指针探秘 指针与指针变量 在程序中声明变量后,编译器就会为改变量分配相应的内存单元。也就是说,每个变量在内存中会有相应固定的位置,有具体的地址。由于变量的数据类型不同,它所占的内存单元数也不...

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单元开始,则操作系统为这些变量和数组分配内存单元,如图所示。
C语言中指针探秘
变量在内存中按照数据类型的不同所占内存的大小也不同,每个变量都有具体的内存单元地址,如变量i在内存的地址是3000,占据2个字节后,数据c的内存首地址就为3002,变量f的内存地址为3008等。对内存中变量的访问,过去用”scanf(“%d”,&a)”表达式将数据输入变量的地址所指示的内存单元。那么访问变量首先应找到其内存的地址,或者说,一个地址唯一指向一个内存变量,称这个地址为变量的指针,如果将变量的地址保存在特定区域,用变量来存放这些地址,这样的变量就是指针变量,通过指针所指向变量的访问,也就是一种对变量的间接访问。
假设一组指针变量pi、pc、pf和pd分别指向上述的变量或数组i、c[]、f和d,指针变量也同样被存放在内存,二者的关系如下。指针变量的存储空间中存放的数据为对应变量或数组的内存地址,通过地址就可以访问对应的变量或数组。
C语言中指针探秘
图 指针变量与所指向变量的映射关系

指针变量的定义与引用

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

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


数据类型  *变量名

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


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,如如下图所示。&运算符称为取地址运算符,作用是取得变量的内存地址。
C语言中指针探秘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语言有两个指针运算符,分别是取地址运算符与间接引用运算符,这两个运算符都是一元运算符,它们的优先级仅次于一元算术运算符。