1.什么是指针?
我们在定义变量时,系统会给这个变量分配内存单元,编译系统会根据程序中定义的数据类型,分配一定长度的内存空间,内存区的每一个字节都有一个编号,这编号就是内存单元的“地址”,它相当于宿舍楼里面的房间号。在地址所标志的内存单元中存放数据,就相当于这个宿舍里面的同学一样。
通过地址能找到所需的变量单元,也可以说,地址指向该变量单元。因此,我们将地址形象化称之为“指针”。意思就是通过它可以找到以它为地址的内存单元。
现假设我们定义了一个用来存放地址的变量p,可以通过下面的语句将a的地址存放到p中。
p = &a;
这时,变量p中存放了变量a的地址,假设该地址为2022,如果要存取a的值,可以采用间接方式:先找到存放a的地址的变量p,从中取得a的地址,然后到该地址的内存单元中取得a的值。
所谓指向就是通过地址来体现的。
一个变量的地址就成为该变量的“指针”。例如,地址2022是变量a的指针。p变量是专门存放a变量的地址,则称p为“指针变量”,指针变量就是存放地址的变量,指针变量的值就是指针。
为了更好的理解,我们举一个例子,通过指针变量来访问整型变量。
#include<stdio.h>
int main()
{
int a = 10;
int b = 20; //定义两个int型变量a、b
int *p;
int *q; //定义两个int型指针变量
p = &a; //把变量a的地址赋给指针变量p
q = &b; //把变量b的地址赋给指针变量q
printf("a = %d,b = %d\n", a, b); //输出a、b
printf("*p = %d,*q = %d", *p, *q); //输出指针变量所指向的整型变量的值
return 0;
}
运行结果:
a = 10,b = 20
*p = 10,*q = 20
程序分析见备注,不再赘述。
2.指针的大小
探讨指针的大小,我们以上图为例。
#include<