指针定义和使用
指针通过获取变量的地址,在使用是加上*号访问该地址的值;
//定义指针
int* p = NULL;
int num = 666;
//指针使用
p = #
printf("%d",*p);
二级指针定义和使用
二级指针用于存储一级指针地址,三级指针存放二级地址,无限循环;
//定义一个二级指针
int** p2 = NULL;
int* p = NULL;
int num = 666;
//让二级指针存放一级指针的地址
p = #
p2 = &p;
//使用二级指针读取一级指针指向的值
printf("%d",**p2);
利用指针修改函数传入的值
一般函数参数是将变量值复制给形参,这样的形参在函数结束后栈区会进行回收而且不会更改传入变量的值,但如果用指针作为形参则可以将变量的地址赋值给指针,这样即使在函数中也可以修改该变量值,实现跨栈区的沟通;
//设置一个函数
void licked(int* p)
{
*p = 100;
}
int main()
{
int i = 0;
int* p = &i;
licked(p);
printf("%d", i); //输出100
}
指针函数
指针函数是一个返回值为指针类型的函数,可以返回指针类型还可以充当左值
int* returnNum()
{
//g_num为全局变量,局部变量地址返回是错误的
return &g_num;
}
//返回值可以充当左值使用 *returnNum为g_num的值
*returnNum = 11111;
函数指针
函数指针是一个可以指向函数的指针,也是我绝对比较牛逼的一个玩法。函数指针的定义方式和平常函数定义方式不同的地方在于用*加指针名代替了原来的函数名而且不用写参数名只需参数类型即可。
//函数指针定义和使用 | 和寻常函数定义不同的是用星号加指针名代替了原来的函数名
int (*pMax)(int a,int b) = NULL;
//函数指针赋值
int Max(int a,int b)
{
return a > b ? a : b;
}
ppMax = &Max; //将函数的地址赋值给函数指针,形参必须和函数指针一致
//函数指针使用方式 | 与原来的函数调用不同的地方就是用指针名代替了函数名
ppMax(1,2);
万能指针
定义万能指针后可以指向任何类型的变量,极其的便利;
//万能指针
//万能指针的定义
void* p = NULL;
int num = 666;
p = #
//万能指针的使用
printf("num == %d",*(int*)p); //打印时需先强转至对应的类型并且使用星号获得该地址的值
函数指针数组
存储多个指向函数的指针的数组
//函数指针数组
//定义方式
int(*pArray[2])(int,int);
//调用方式
pArray[0]=Max;
pArray[1]=Sum;
for(int i = 0;i < 2;i++)
{
pArray[i](100,200);
}
以一个以函数指针为参数的函数指针为参数的函数
int Max(int a,int b)
{
return a > b ? a : b;
}
//以一个函数指针为参数的函数
void printData(int(*pMax)(int,int),int a,int b)
{
}
void userPrint(void(*p)(int(*)(int,int)),int(*pMax)(int,int),int a,int b)
{
p(Max,a,b);
}
//调用方式
userPrint(printData,Max,1,2);
//利用函数指针指向该函数并且调用
void (*pFunC)(void(*)(int(*)(int,int)),int(*)(int,int),int,int) = NULL;
pFunc = userPrint;
//将一个函数转化为参数函数指针参数的公式
1.函数名用*加指针名代替,去掉该函数的参数名称
例如:void printData(int(*pMax)(int,int),int a,int b);
变成:void (*P)((int)(*)(int,int),int,int));