6.1指针的定义
6.1.1指针的本质(间接访问原理)
- 内存区域中每字节对应一个编号,这个编号就是“地址”。如果在程序中定义了一个变量,那么在对程序进行编译时,系统会给这个变量分配内存单元。
- 按变量存取变量值的方式称为“直接访问”,如printf("%d\n",i); scanf("%d",%i);等。
- 将变量i的地址存放到另一个变量中,称为“间接访问”,例如指针用来存放变量地址。
指针变量定义格式:
基类型 *指针变量名;
例如:
//第一种写法,其中,i_pointer是变量名,即指针变量
int *i_pointer; //更推荐第一种写法
//第二种写法
int* i_pointer;
【注意】
- 指针与指针变量是两个概念,一个变量的地址称为该变量的“指针”。(地址=指针)
- 如果有一个变量专门用来放另一变量的地址(即指针),那么称它为“指针变量”。
- 若编写的程序都是64位的应用程序,寻址范围为64位即8字节,那么sizeof(i_pointer)=8;如果编写的程序是32位,那么寻址范围就是4字节(考研通常强调程序为32位程序)
- 说某个变量的地址时,说的都是它的起始地址
6.1.2取地址操作符& 与取值操作符* 及指针本质
- 取地址操作符(也称引用):&
- 取值操作符(也称解引用):*
【取地址与取值】
#include <stdio.h> int main() { int i = 5; //指针变量的初始化是某个变量取地址来赋值,不能随机写个数 //必须保证同一类型变量的地址赋给同一类型的指针 int *i_pointer; //定义了一个指针变量,i_pointer是指针变量 i_pointer = &i; //取地址,指针变量初始化一定是某个变量取地址 //line 7 和 line 8 可以一起写成 int *i_pointer = &i; printf("i=%d\n", i);//直接访问 printf("*i_pointer=%d\n", *i_pointer);//间接访问 *单目运算符从右至左结合 return 0; }
【运行结果】
【运行机制】
【注意】
- 指针变量前面的“*”表示该变量为指针型变量,例如:float *pointer_1; 指针变量名是pointer_1而不是*pointer_1。
- 定义指针变量时必须定义其类型,注意只有同一类型变量的地址才能放到指向同一类型的指针变量当中。
【拓展】
如果已经执行了语句
i_pointer = &i; //取地址
- 再执行 &*i_pointer 是什么含义:
&*i_pointer(先取值*再取地址&)与&i相同,都表示变量i的地址,也就是i_pointer,因为先执行*pointer_1就相当于拿到i(此时为i的地址),再去&又是拿地址。(不要用这种写法)
- *&i含义是什么:
首先进行&i运算,得到i的地址,再进行*运算,得到还是i的地址,*&i与*pointer_1作用一致,都等价于变量i,即*&i与i等价。
为什么要让*号写在指针变量前面:
因为如果要声明三个指针变量时正确的语句是
int *a,*b,*c;