栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

【C语言指针】函数指针及回调函数、动态空间分配以及释放、二级指针的应用

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【C语言指针】函数指针及回调函数、动态空间分配以及释放、二级指针的应用

指针
        • 一、函数指针
          • 函数指针应用:回调函数
        • 二、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要加括号
		}
	}
}

结论:函数内改变指针指向要使用指针类型返回或者使用二级指针。不过使用指针返回值的方法中,局部指针变量开辟的动态空间存放在堆区,即使函数结束也不会自动释放,又因为要返回指针(返回前不能释放) 故,使用指针返回值的方法会造成内存的泄露,还是使用二级指针妥当。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1029900.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号