C语言中的指针

前言:

随着编程语言的越来越多,但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], []的 运行级别高于*;

总结:

我们可以用指针指向变量,函数,数组,从而可以轻易的改变内存的值,灵活的使用指针往往可以做到事半功倍的效果





猜你喜欢

转载自blog.csdn.net/welbell_uplooking/article/details/79174102