- 一、函数指针
- 函数指针应用:回调函数
- 二、malloc和free
- 三、二级指针(慎用,能不用则不用)
- 改变指向的两种方法
声明函数指针:
1、(类型*)(类名::*指针名)(参数列表)=类名::函数名;
int add(int n1,int n2)
{return n1+n2;}
int (*p)(int ,int )=add;//执行add函数的指针,加不加&都一样
void main()
{
printf("add(1,2)=%dn",(*p)(1,2));//*p一定要用括号包围,或者直接p(1,2)
}
2、typedef 类型 (*指针名)(参数列表);
//创建了一个函数指针类型ptr
typedef int (*ptr)(int ,int)
int sub(int n1,int n2)
{return n1-n2;}
void main()
{
//定义
ptr p1=sub;
printf("sub(2,1)=%dn",(*p1)(2,1));//p(2,1)
}
函数指针应用:回调函数
例:
typedef int(*p)(int,int);
int callback_add(int x,int y,p func)//也可以不用typedef,直接在参数里写int(*p)(int,int)
{
return func(x,y);
}
int add(int x,int y)
{
return x+y;
}
void main()
{
int x=3,y=4;
int z=callback_add(x,y,add);//z=7;
}
二、malloc和free
1、void* malloc(size_t size) ///参数是字节数
例:创建一个4个int大小的数组空间
int* arr=(int *)malloc(4*sizeof(int));//(int *)为强制类型转换
2、void free(void* ptr)//与malloc配套使用:
free(arr);
3、free使用注意事项
free的指针必须是指向malloc函数开辟出的空间的首地址 (即指针在释放前应该变回首地址,或采用另一个指针存储首地址)三、二级指针(慎用,能不用则不用)
使用原因:由于C语言没有引用类型,如果要在函数内改变指针指向,只能使用二级指针
以下函数改变不了指针:
void changePtr(int* p)
{
p = (int*)malloc(4 * sizeof(int));
if (p)
{
for (int i = 0; i < 4; i++)
{
p[i] = i;
}
}
}
void main()
{
int* a = NULL;
changePtr(&a);
if (a)
{
for (int i = 0; i < 4; i++)
{
cout << "a[" << i << "]=" << a[i] << endl;
}
free(a);
a = NULL;
}
}
结果:空
原因:函数参数传入指针,只能改变指针指向地址存储的值,无法改变指针指向
1、使用指针类型返回值
int* changePtr()
{
int *p = (int*)malloc(4 * sizeof(int));
if (p)
{
for (int i = 0; i < 4; i++)
{
p[i] = i;
}
}
return p;
}
2、使用二级指针
int changePtr(int** p)
{
*p = (int*)malloc(4 * sizeof(int));
if(*p)
{
for (int i = 0; i < 4; i++)
{
(*p)[i] = i;//*p要加括号
}
}
}
结论:函数内改变指针指向要使用指针类型返回或者使用二级指针。不过使用指针返回值的方法中,局部指针变量开辟的动态空间存放在堆区,即使函数结束也不会自动释放,又因为要返回指针(返回前不能释放) 故,使用指针返回值的方法会造成内存的泄露,还是使用二级指针妥当。



