变量的本质是程序中用来存放数据的一段存储空间,一般情况下变量所对应的存储空间在内存区域,C语言中程序员可以通过关键字register声明变量的存储单元是CPU中的寄存器。变量的数据类型不同,它所占的内存单元数也不相同。在访问变量时,首先应找到其在内存的地址,如果在程序中将变量的地址保存在另一个变量中,则形成指针变量,通过指针对所指向变量的访问是一种对变量的“间接访问”。
1. 直接访问与间接访问
例如,定义两个变量:整型变量a和指针变量ptr,在存取变量a中的数据时,可通过变量a或指向变量a的指针来进行,分别称为直接访问和间接访问。
int a; /a是整型变量,其值为整数/
int *ptr; /ptr是指针变量,其值为一个整型变量的地址/
(1)直接访问变量a中的数据:
a = 5; /将字面值5赋值给变量a/
a + 10; /读取变量a的值并与字面值10相加/
(2)间接访问变量a中的数据:
ptr = &a /将变量a的地址赋值给指针变量ptr,称ptr指向变量a/
ptr = 5; /指针变量ptr指向的对象用ptr表示/
/等价于a = 5;,通过指针变量ptr访问变量a/
经上述定义和处理后,变量a和指针变量ptr之间的关系如图所示:
图1 指针变量ptr与指针变量指向的对象*ptr(a)
2. 多级指针
若指针变量指向的对象仍然是一个指针变量,则称为多级指针。例如,对于下面的变量定义,mulptr是指向指针变量ptr的变量:
int a, *ptr = &a, **mulptr = &ptr
根据应用的需要,可以采用三级或多级指针。当然,采用多级指针在带来灵活性的同时降低了对数据的访问效率。
四、指针常见错误及避免方法
未初始化指针(野指针):声明指针时应及时初始化,未指向有效地址时赋值为NULL。
空指针解引用:使用指针前应检查是否为NULL,避免对空指针进行解引用操作。
指针越界访问:访问数组等连续内存时,确保指针操作不超出合法范围。
内存泄漏:动态分配的内存使用完后及时free,避免内存泄漏。
悬空指针:释放内存后将指针置为NULL,避免指针继续指向已释放的内存。
类型不匹配:确保指针类型与指向的变量类型一致,必要时进行强制类型转换。