前言:
随着编程语言的越来越多,但C语言在编程语言中的地位似乎始终没有改变,其中得益于C语言中的指针,可以直接去操作内存地址与寄存器,执行效率也高,在嵌入式领域运用得尤其广泛。对于初学者来说指针是C语言中很难翻越的一座大山,指针的掌握程度直接关系到C语言的掌握程度,其实指针并不是那么高不可攀,只是纸老虎而已,只要正确的理解指针的概念,多编程多调试,也就很容易掌握。
概括:
计算机的所有数据都保存在内存中,不同的数据类型所占的字节数又不同,比如int型占4个、char型占1个,为了正确的访问这些数据必须为每个内存编写相应的编号,而这编号就是我们所说的指针,指针就是地址,只有找到相应的内存地址就能取出相应的数据,就如同我们生活中的身份证号、门牌号,只有找到相应身份证号、门牌号才能找到相应的人与房间。
一级指针的理解:
用于存放变量的地址。
int main(void)
{
int a = 5; //给int型变量赋值,相当于在内存中开辟一块4个字节的空间存放整数5
int *p = NULL; //定义一个整形指针变量, (俗话说指针很可怕,定义的时候必须初始化,这里我们给NULL)
p = &a; //给指针p赋值,即把变量a的地址给指针p(指针就相当与地址)
printf("&a = %p,p = %p,*p = %d\n",&a,p, *p); //打印结果
return 0; //函数的返回值
}
打印结果:&a = 0x28ff40, p = 0x28ff40, *p = 5; //*p 取内存地址的值。
二级指针的理解:
用于存放一级指针变量的地址
int main(void)
{
int a = 5;
int *p = NULL;
int **q = NULL; //二级指针也是地址,定义的时候要初始化
p = &a;
q = &p; //把指针p的地址给二级指针q
printf("**q = %d, *p = %d, a = %d\n",**q, *p, a); //**q取二级指针变量的值 ,*p取一级指针变量的值
return 0;
}
打印结果 **q = 5, *p = 5, a = 5;
结论:二级指针指向一级指针,一级指针指向变量
这样只需通过就能通过指针去改变内存中的存放的数据;
函数指针:
一级指针指向普通变量,存放普通变量的地址。二级指针指向一级指针,存放普通变量的地址的地址。
这时候就会有人想假如我内存中存放的一个函数地址那该怎么办,这时就需要函数指针;
#include<stdio.h> //包含头文件
int max(int a, int b) //子函数
{
return a >b ? a : b;
}
int main(void) //主函数
{
int x, y, maxval;
int (*p)(int , int) = NULL; //定义一个函数指针,函数的参数变量可以省略,函数指针也是地址所以必须初始化;
x = 5;
y = 6;
p = max; //函数指针指向函数max
maxval = p(5,6); //把函数的返回值赋值给maxval
printf("maxval = %d\n",maxval);
return 0;
}
打印结果:maxval = 6;
理清常用概念:
函数指针:指向函数的指针; 例 :int (*p)(int a, int b);
指针函数:函数的返回值是指针; 例:int *p(int a, int b);
数组指针:指向数组的指针; 例:int(*p)[SIZE],也相当于一个二维数组的指针;
指针数组:数组里面存放的是指针; 例: int *p[SIZE], []的 运行级别高于*;
总结:
我们可以用指针指向变量,函数,数组,从而可以轻易的改变内存的值,灵活的使用指针往往可以做到事半功倍的效果。