C语言指针(基本指针、函数指针、万能指针) 数据类型:实现空间的合理利用 char:1字节,int:4字节(short,long) 指针和内存内部存贮器:暂存程序/数据,掉电会丢失数据 物理存储器:实际存在的具体存储器芯片 存储地址空间:对存储器编码的范围 内存是cpu和硬盘的桥梁 内存地址:对内存中的每一个字节分配一个32位或64位的编号 指针变量 定义一个变量单独存放上面的编号就是一个指针变量;取变量的地址&表示变量的起始地址定义一个指针变量用来存放变量的地址*p。 通俗来说指针就是地址,指针在32位机器下是4个字节,在64位机器下是8个字节。sizeof() 变量和指针变量建立关系:p=&num 在定义的时候:*p表示p是一个指针变量,而不是一个普通的变量 在使用的时候:*p表示取保存地址相应编号的内容 指针变量的两种类型:自身类型和指向类型 eg:int *p=NULL; p自身的类型就是int*,指向类型就是int 指针变量指向类型的作用:决定着指针变量所取空间内容的宽度,决定了指针变量+1跳过的单位宽度 在linux和windows系统中,数据在内存中倒着存倒着取 eg:int num=0x;我们需要取出0x3456的时候需要定义一个char*类型的指针先去步长再取范围,那就必须将指针强制转换成short*类型进行扩容。
野指针 野指针顾名思义,指针指向的位置不可知,就像没有主人的流浪狗。 指针未被初始化 指针越界访问 指针指向的空间释放 变量a的地址只在test()函数内有效,当把a的地址传给指针p时,因为出了test函数,变量a的空间地址释放,导致p变成了野指针。 指针的关系运算 例如:定义int* p1,数组int arr[5],p1>&arr[5]。 但是要遵循一个标准:允许指针指向数组素和指针指向数组最后一个素后面的位置进行比较,不允许指针指向数组素与指针指向数组第一个位置的前面进行比较。 二级指针 二级指针就是存放指针地址的指针变量。就像有三个抽屉第一个抽屉的钥匙放在第二个抽屉,第二个抽屉的钥匙放在第三个抽屉。 例如:int a=10;int* p1=&a;int p2=&p1; 对int* * 做解释:第一个*号代表指针指向的类型是int*的,第二个*代表这个是指针。 函数指针 定义:就是一个指向函数的首地址的一个指针变量 1.定义函数指针 用(*指针名)替换函数名,剩下的照抄 eg:int(*p)(int a,int b)=NULL; 形参可以不写! 野指针//悬浮指针没有指向的指针 2.通过函数指针调用函数 两种方式: 直接使用函数指针替换函数名的方式调用 指针的基本操作去调用,取*运算再调用 (*p)(1,2);
函数指针的作用: 回调函数(以函数指针作为参数的函数) typedef定义函数指针的用法:就是给已存在的类型起别名 eg:typedef int INT;typedef int ARR [3];ARR arr;(int arr[3]) eg:typedef int(*FUNC)(int a,int b) FUNC func;(int(*func)(int a,int b)) 结构体中的别名: eg:typedef struct Node{ int data; struct Node* next; }NODE,*LPNODE,ARRAY[3]; 理解:{}中间的不管,就相当于给结构体起了一个别名,给结构体的指针起了一个别名,给结构体的数组起了一个别名。 typedef可以帮助我们更便于理解函数指针的参数问题 eg: void function1(int (*p)(int , int ),int a ,int b) { printf(“%d ”, p(a, b)); } 改: typedef int (*FN)(int , int ); void function1(FN fn,int a ,int b) { printf(“%d ”, fn(a, b)); } 万能指针 能操作任何类型的指针,在使用之前需要进行强制类型转换; void* p=NULL; 基本指针的类型转换和变量的类型转换类似,函数指针的类型转换需要确定函数指针的类型再进行转换。 eg: 函数指针p的类型就是void (*)() 万能函数充当函数指针 1.*前面的const写在前面还是后面没什么区别 const int或int const修饰的是数据的类型 2.const写在*后面的话表示修饰的指针是不能改变指向的 eg: 指针数组 多个数组名有规律的指针变量 eg: char* pstr[3]; 先后再前 数组指针 int(*array)[3]=NULL; 指针所指向一个类型int[3]指针指向的一个数组的指针。一般用来操作二维数组。 区别举例: int arr[5] //名为arr的数组,数组里有5个素,每个素是int int* p1[5] //指针数组,数组里有5个素,每个素是int* int (*p2)[5] //数组指针,一个指向数组(里面有五个素,每个素是int)的指针 int (*p3[5])[5] //p3[5]是一个有5个素的数组,数组里每个素是int(*)[5] 回调函数 qsort()函数: 是一个库函数,基于快速排序算法实现的一个排序的函数。优点是,任意类型的数据都能排序。 qsort()函数的形参定义: void qsort(void* base(起始地址),size_t num(素个数),size_t width(一个素的字节长度),int (*cmp)(const void* e1,const void* e2)(自定义比较函数)) qsort()函数应用:模拟计算器,排序结构体
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/60961.html