c语言相比其他高级语言来说,更接近于对计算机硬件的操作,而指针的应用更是为我们对硬件的操作插上了翅膀,所以指针是嵌入式编程不可少的一部分,在一定意义上说,指针是c语言的精髓。
欢迎加入嵌入式学习群:559601187
一、 什么是指针
在计算机中,数据时存放在内存中的,而内存其实就是一组有序字节组成的数组,一般以一个字节为一个内存单元,每个字节都有唯一的地址。cpu通过寻址的方式去查找内存中某个变量的位置,我们知道定义变量就是向CPU申请一个某一类型的空间,这个空间也有自己的地址,同样地址也需要一种类型去存储,C语言规定用指针类型的变量去存储地址类型。记住一点:指针就是地址,指针变量时存放地址类型的变量。
二、指针变量的定义
2.1 声明并初始化一个指针
可以保存地址值的变量称为指针变量,指针变量定义如下:
数据类型 * 变量名
这里的数据类型为基本数据类型、构造类型,指针变量的声明比普通变量的声明多了一个’ * ‘,运算符’ * '就是间接引用或间接寻址。例如:
int *p; // 声明一个 int 类型的指针 p
char *p // 声明一个 char 类型的指针 p
int *arr[10] // 声明一个指针数组,该数组有10个元素,其中每个元素都是一个指向 int 类型对象的指针
int (*arr)[10] // 声明一个数组指针,该指针指向一个 int 类型的一维数组
int **p; // 声明一个指针 p ,该指针指向一个 int 类型的指针
在上面的声明中:p就是一个指针变量,里面存着一个地址。
这里要注意**指针在使用前一定要初始化,否则就会指针就会变成野指针。初始化有3种方式:
/* 方法1:使指针指向现有的内存 */
int x = 1;
int *p = &x; // 指针 p 被初始化,指向变量 x ,其中取地址符 & 用于产生操作数内存地址
/* 方法2:动态分配内存给指针 */
int *p;
p = (int *)malloc(sizeof(int) * 10); // malloc 函数用于动态分配内存
free(p); // free 函数用于释放一块已经分配的内存,常与 malloc 函数一起使用,要使用这两个函数需要头文件 stdlib.h
/*方法3:定义为NULL */
int *p=NULL;
指针的初始化就是给指针一个合理的指向,让程序知道往哪指,上述NULL是一个特殊的指针变量,相当于0。地址为0的内存一般都不允许访问,但是内存地址为0有一个重要的意义,它表明指针指向不指向一个可访问的内存地址。
2.2 指针的调用
访问内存空间,一般分为直接访问和间接访问。
如果知道内存空间的名字,可通过名字访问该空间,称为直接访问。由于变量即代表有名字的内存单元,故通。过变量名操作变量,也就是通过名字直接访问该变量对应的内存单元。
如果知道内存空间的地址,也可以通过该地址间接访问该空间。对内存空间的访问操作一般指的是存、取操作,即向内存空间中存入数据和从内存空间中读取数据。
在 C 语言中,可以使用间接访问符(取内容访问符)*来访问指针所指向的空间,例如:
int *p,a=3;//p中保存变量a对应内存单元的地址
p=&a;
在该地址 p 前面加上间接访问符 *,即代表该地址对应的内存单元。而变量 a 也对应该内存单元,故 *p 就相当于 a。
printf("a=%d\n",a); //通过名字,直接访问变量a空间(读取)
printf("a=%