指针
回调函数
定义:函数指针最常用的地方在于将一个函数作为参数传递给另一个函数的时候要用函数指针将一个函数作为参数 传递给另外一个函数,将这个函数称为回调函数。
int js(int (*p)(int a,int b),int a,int b)
{
return p(a,b);
}
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int main()
{
int a=10;
int b=20;
int c;
c = js(add,a,b);
printf("%d\n",c);
c = js(sub,a,b);
printf("%d",c);
return 0;
}
函数指针数组
定义:本质是一个数组,数组里面的每个元素都是一个函数指针。
表示: 返回值类型 (*函数指针变量名【函数指针的个数】) (形参列表)
int (*p[10]) (int a,int b)
int add(int a,int b)
{
return a+b;
}
int sub(int a,int b)
{
return a-b;
}
int cheng(int a,int b)
{
return a*b;
}
int chu(int a,int b)
{
return a/b;
}
int quyu(int a,int b)
{
return a%b;
}
int main()
{
int a=10;
int b=20;
int i;
int (*p[5])(int a,int b)={add,sub,cheng,chu,quyu};//数组有五个元素,数组中额每个元素都是一个函数指针
for(i=0;i<5;i++)
{
printf("%d\n",p[i](a,b));
}
return 0;
}
只读指针变量和只读变量指针
只读指针变量
地址不能被修改,值可以改。
表示: 类型 * const 变量名
int main()
{
int a=10;
int b=20;
int *const p=&a;
printf("%p\n",p);
printf("%d\n",*p);
// p=&b;//用const修饰的指针变量地址无法改变
// printf("%p",p);
// printf("%d",*p);
*p=100;
printf("%p\n",p);
printf("%d\n",*p);
printf("%d",a);
return 0;
}
只读变量指针
地址可以修改,值不能修改。
表示:类型 const *变量名
int main()
{
int a=10;
int b=20;
int const *p=&a;
printf("%p\n",p);
printf("%d\n",*p);
printf("%d\n",a);
p =&b;
printf("%p\n",p);
printf("%d\n",*p);
printf("%d\n",a);
// *p=200;
return 0;
}
特殊指针
硬编码付给指针:int *p=100
空指针:int *p=NULL
野指针:用malloc()函数开辟,free()释放
int main()
{
int *p;
p=malloc(100);
if(p==NULL)
{
return -1;
}
p=&a;
...
free(p);
p=NULL;
return 0;
}
万能指针:void *
int main()
{
char ch='z';
void *pp;
pp= &ch;
printf("%c",*((char*)pp));//将指针void转换char型
*((char*)pp)='x';
printf("%c",*((char*)pp));
}