指针
指针类型
- 指针类型决定了指针进行解引用操作的时候,能够访问空间的大小
int* p; *p可以访问4个字节
char* p; *p可以访问1个字节
double* p; \*p可以访问8个字节
- 此可访问空间大小取决于int,char,double本身所占空间的大小
指针加减整数
- 指针加减整数n会将地址偏移指针类型可访问字节数*n个字节
int *p
p = 0x11111111
p+2==0x11111119//2*4=8;int\* 可以访问4个字节;对应的int所占4字节
指针与数组
- 数组名是数组首元素地址
- &arr- &数组名-数组名部署首元素的地址-数组名表示整个数组-&数组名 取出的是整个数组的地址
- sizeof(arr) - sizeof(数组名) - 数组名表示的整个数组-sizeof(数组名)计算的是整个数组的大小
int arr[5]//arr是一个5个元素的整形数组
int *parr1{10}//parr1是一个数组,数组有10个元素,每个元素的类型是int*,parr1是指针数组
int (*parr2)[2]//parr2是一个指针,该指针指向了一个数组,数组有10个元素,每个元素的类型是int-parr2是数组指针
int (*parr3[10])[5]//parr3是一个数组,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int
函数指针
- 函数指针是指向函数的指针,它可以存储函数的地址,允许在程序运行时动态地调用函数。在C和C++等编程语言中,函数指针可以用来实现回调函数、动态函数调用等功能。通过函数指针,可以将函数作为参数传递给其他函数,也可以在运行时根据需要改变调用的函数。
#include <stdio.h>
// 定义一个函数
void sayHello() {
printf("Hello, World!\n");
}
int main() {
// 声明一个函数指针,指向无返回值、无参数的函数
void (*funcPtr)();
// 将函数地址赋给函数指针
funcPtr = sayHello;
// 通过函数指针调用函数
funcPtr();
return 0;
}
在这个示例中,funcPtr 是一个指向无返回值、无参数的函数的指针。通过将 sayHello 函数的地址赋给 funcPtr,我们可以通过 funcPtr() 调用 sayHello 函数
- 函数指针数组的应用(计算器)
#include<stdio.h>
void menu()
{
printf("************************\n");
printf("**1.add\t2.sub**\n");
printf("**3.mul\t4.div**\n");
printt("**\t0.exit\t**");
}
int Add(int x,int y)
{
return x+y;
}
int Sub(int x,int y)
{
return x-y;
}
int Mul(int x,int y)
{
return x*y;
}
int Div(int x,int y)
{
return x/y;
}
int main()
{
int input = 0;
int x=0;
int y=0;
int (*pfArr[5])(int,int)={0,Add,Sub,Mul,Div};//转移表
do
{
menu();
printf("请选择:");
scanf("%d",&input);
if(input>=1&&input<=4)
{
printf("请输入两个操作数:");
scanf("%d%d",&x,&y);
int ret = prArr[input](x,y);
printf("%d\n",ret);
}
else if(input==0)
printf("退出");
else
printf("err");
}
}
在程序的主循环中,根据用户输入的选择,通过调用相应的函数来执行加法、减法、乘法或除法操作。这样通过函数指针数组,可以实现根据用户选择动态调用不同的函数,从而实现了代码的灵活性和可扩展性。
回调函数
- 回调函数是指将一个函数作为参数传递给另一个函数,并在该函数内部被调用。这种机制允许您在运行时动态地指定要执行的特定代码。回调函数通常用于事件处理、异步任务和通用接口设计
#include <stdio.h>
// 回调函数的原型
typedef void (*CallbackFunction)(int);
// 接受回调函数作为参数的函数
void performOperation(int data, CallbackFunction callback)
{
printf("Performing operation with data: %d\n", data);
// 调用回调函数
callback(data);
}
// 回调函数示例
void callbackFunction(int result)
{
printf("Callback function called with result: %d\n", result);
}
int main()
{
int data = 10;
// 调用 performOperation,并传递回调函数
performOperation(data, callbackFunction);
return 0;
}