一、指针的定义
内存区域中的每字节都对应一个编号(即地址)。如果在程序中定义了一个变量,那么在对程序进行编译时,系统会自动给这个变量分配内存单元。按变量地址存取变量值的方式称为“直接访问”,如printf(“%d,i);、scanf(“%d”,&i);等。另一种存取变量的方式称为“间接访问”,即将 变量i的地址存放到另一个变量中。C语言中指针是一种特殊的变量,它用来存放变量地址。
指针变量的定义格式如下:
基类型 *指针变量名
eg.int *i_pointer;
(1)指针:一个变量的地址。eg.地址2000是变量i的指针。
(2)指针变量:一个变量专门用来存放另一变量的地址(即指针)。
说某个变量的地址时,讲的是它的起始地址。
i_pointer本身站多大的内存空间呢?本章中编写的程序都是64位应用程序,寻址范围为64位即8字节,所以本章sizeof(i_pointer)=8。如果编写的程序是32位,那么寻址范围就是4字节(考研中会强调程序是32位的程序)。
二、取地址操作符与取值操作符
取地址操作符为&,也称引用,通过该操作符我们可以获取一个变量的地址值;取值操作符为*,也称解引用,通过该操作符可以得到一个地址对应的数据。
eg.通过&i获取整型变量i的地址值,然后对整型指针变量p进行初始化,p中存储的是整型变量i的地址值,所以通过*p(printf函数中的*p)可以获取整型变量i的值。p中存储的是一个绝对地址值,为什么取值时会获取4字节大小的空间?——因为p为整型变量指针,每个int型数据占用4字节大小的空间,所以p在解引用时会访问4字节大小的空间,同时以整型值对内存进行解析。
// &符号是取地址,指针变量的初始化一定是某个变量取地址
#include <stdio.h>
int main(int argc, const char * argv[]) {
int i=5;
//指针变量的初始化是某个变量取地址来赋值,不能随机写个数
int *i_pointer=&i;//定义一个指针变量,i_pointer是指针变量名
printf("i=%d\n",i);//直接访问
printf("*p=%d\n",*i_pointer);//间接访问
return 0;
}
三、指针的本质
注意以下3点。
(1)指针变量前的“*”表示该变量为指针型变量。
eg.float *pointer_1;
注意指针变量名是pointer_1,而不是*pointer_1.
(2)在定义指针变量时必须指定其类型。只有整型变量的地址才能放到指向整型变量的指针变量中。
(3)如果已执行了语句pointer_1=&a;那么&*pointer_1的含义是什么呢?
“&”和”*”两个运算符的优先级别相同,但要按自左向右的方向结合。因此,&*pointer_1与&a相同,都表示变量a的地址,也就是pointer_1.
*&a的含义是什么呢?
首先进行&a运算,得到a的地址,再进行*运算。*&a和*pointer_1的作用是一样的,都等价于变量a,即*&a与a等价。