函数指针数组
1、当想要存储多个函数入口地址时,需要定义多个函数指针变量来存储
2、数组就是一次性定义多个变量的操作
3、想要存储多个函数指针变量,就可以调用一个函数指针数组来完成,对函数的鼻梁处理
4、定义格式:数据类型 (*数组名p[数组长度])(形参列表)
#include <stdio.h>
int he(int m,int n)
{
return m+n;
}
int cha(int m,int n)
{
return m-n;
}
int ji(int m,int n)
{
return m*n;
}
int main()
{
int (*jishuan[3])(int,int)={he,cha,ji};
for (int i = 0; i < 3; i++)
{
printf("结果为:%d\n",jishuan[i](5,9));
}
return 0;
}
二级指针
1、指针变量也是在内存中占相应的存储空间的,共占8字节的空间
2、既然有地址空间,就有起始地址,该地址也是一个比较难记忆的数字,于是定义一个指针变量来存储
3、存储指针变量的指针变量,称为二级指针变量
4、定义格式:数组类型 **指针名
5、二级指针的应用:
指针变量 指向的一级指针中的地址
*指针变量 一级指针变量中的值
**指针变量 一级指针变量所指向的内存空间的值
#include <stdio.h>
int main()
{
int num = 520;
int *ptr = #
int **qtr = &ptr;
printf("num = %d\n",num);
printf("*ptr = %d\n",*ptr);
printf("**qtr = %d\n",**qtr);
//qtr = &(&num) 不可行 c语言中运算e结果是右值,是临时值,无内存
return 0;
}
qtr+1 偏移了 8 ,它说明是int * 类型的(偏移量由数据类型决定)
#include<myhead.h>
int main(int argc, const char *argv[])
{
int num = 520; //定义一个普通变量
int *ptr = # //将普通变量的地址赋值给指针变量
int * *qtr = &ptr; //将指针变量的地址赋值给二级指针变量
printf("num = %d\n", num); //通过普通变量访问值
printf("*ptr = %d\n", *ptr); //通过一级指针变量访问值
printf("**qtr = %d\n", **qtr); //通过二级指针变量访问值
//qtr = &(&num); //该语句是错误的,C语言中所有表达式的结果都是一个右值
int arr[3][3] = {1,2,3,4,5,6,7,8,9}; //定义二维数组
//arr <==> &arr[0] ==> &&arr[0][0]
qtr = arr; //?
printf("sizeof(qtr) = %ld\n", sizeof(qtr)); //8
printf("sizeof(arr) = %ld\n", sizeof(arr)); //36
printf("qtr = %p, arr = %p\n", qtr, arr); //一样
printf("qtr+1 = %p, arr+1 = %p\n", qtr+1, arr+1); //一样
//printf("*qtr = %p\n", *qtr);
当二级指针执行二维数组时,不能直接访问元素
//printf("%d\n", qtr[0][0]); //不可以访问
return 0;
}
二级指针的一般使用
#include <stdio.h>
int erji_zz(int **ptr)
{
static int key = 2024;
*ptr = &key;
}
int main()
{
int a = 2010;
int *qtr = &a;
erji_zz(&qtr);
printf("*qtr = %d\n",*qtr);
return 0;
}
万能指针
1、万能指针可以接收任何变量的地址
2、定义格式: void *指针名
3、注意:万能指针变量只能接收给定空间的起始地址,并没有实际类型的限制
4、万能指针变量不能直接进行取值运算,只能转变为集体的指针变量进行取值
基础用法
常用
#include<myhead.h>
int main(int argc, const char *argv[])
{
int num = 0x12345678;
char key;
//定义万能指针变量
void *ptr = #
printf("&num = %p, ptr = %p\n", &num, ptr);
//printf("*ptr = %d\n", *ptr); //不能直接操作
key = *(char *)ptr; //将万能指针转变成具体的指针使用
printf("key = %#x\n", key);
return 0;
}