点击上方蓝字关注我,了解更多咨询
当我们声明一个变量或常量时,计算机系统会为这个变量或常量分配存储单元,变量的数据存储到被分配的存储单元内,对变量的赋值和取值操作都是针对存储单元的操作。
C编译器是如何通过变量找到与其对应的存储单元呢?实际上变量是被分配单元内存地址的名称,对开发者来说,记住一个变量名称要比记住用十六进制表示的内存单元地址更加简单,因此变量是内存单元地址的名称表示,开发者可以通过变量名来访问内存单元中的数据。下图给出了变量、数据和内存地址之间的关系。
我们知道“&”运算符是获取变量的内存地址,下面做一个实验,连续声明三个整型变量a、b、c,然后使用“&”运算符取出变量a、b、c的内存地址并输出到控制台。
#include <stdio.h>
void main()
{int a = 20,b=10,c=0;
printf("变量a的内存地址:%d\n",&a);
printf("变量b的内存地址:%d\n",&b);
printf("变量c的内存地址:%d\n",&c);
}
输出结果如下:
由于内存对齐的原因,实际每个int占用了12个字节的存储空间,内存对齐主要是为了快速访问内存的数据。从输出结果图可以看出,变量a、b、c指向的存储空间连续占用了36个字节的内存。
C语言把变量的内存地址作为一种可处理的数据,称为指针值,以内存地址为值的变量称为指针变量,简称指针(pointer)。使用指针变量可以保存变量等程序对象的地址,通过它们就可以访问和处理变量等有关对象。
例如:a是一个整数类型的变量,a的值为0x20,变量a的内存地址为0xaffe,变量ptr存储变量a的内存地址0xaffe,则称ptr为指针变量,通过ptr可以直接存取变量a的值。
指针变量ptr名称前面带有“*”符号,表示这是一个指针变量,它存储的是其它变量或程序对象的内存地址。由于指针变量存储了其它变量或程序对象的地址,因此通过指针变量可以访问或修改它们的内容。
和其它变量相同,在声明指针变量时,也需要确定一个数据类型,即存储该数据类型变量的地址。例如前面的指针变量ptr只能存储int数据类型变量的地址,而不能指向其它数据类型的变量。
在C语言中,声明指针变量的语法为:
datatype *pointerName;
其中,datatype是数据类型,pointerName是指针变量的名称。符号“*”不是pointerName的一部分,它只是告诉编译器这是一个指针变量,用于存储datatype类型变量的地址。
例如:
// 声明一个存储整型变量地址的指针变量prt
int *prt;
// 声明一个存储浮点型变量地址的指针变量fprt
float *prt;
// 可以在一行语句中声明多个同类型的指针变量
int *p,*ptr;
声明指针变量后,需要初始化和赋值后才能使用,否则会出现意想不到的错误,因为指针变量可以直接对内存进行操作。当声明指针变量时,若暂时不能确定指针变量存储的内存地址,可以将指针变量设置为null:
int *ptr = NULL;
NULL是C语言的一个宏定义,宏定义类似符号常量的定义,都是使用define关键字来定义。NULL表示一个0指针,既不存储任何内存地址的指针。
END
*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。
戳“阅读原文”我们一起进步