前言
本文用来记录自己的学习过程,主要是c语言指针中的函数指针和无类型指针。以及无类型指针中可能遇到的内存泄露问题。
指针学习记录
函数指针
要点
定义:(int *p)(int a,int b) ;
- *为指针标识 ;
- ()为函数标识 ;
- 函数指针是专用的,格式要求很强(参数类型、个数、返回值)同数组指针一样。
赋值:p=Wellcome;
- 可以直接用函数名对函数指针进行赋值
调用:
- p(); 直接通过指针名字调用函数
- (*p)();取内容(*指针名)()
示例
#include <stdio.h>
#include <stdlib.h>
void WellCome()
{
printf("欢迎进入程序\n");
}
int add(int a,int b)
{
return a+b;
}
int main()
{
//1.如何定义函数指针
void (*p)();//1.*标识指针 2.()号标识函数 3.函数指针是专用的,格式要求很强(参数类型,个数,返回值),就像数组指针一样
//2.如何给函数指针赋值
p=WellCome; //函数名就是地址,就像数组一样,数组名就是地址
//3.如何通过函数指针调用函数
p(); //直接通过指针名字调用函数
(*p)(); //取内容(*指针名字)()
int (*p2)(int a,int b);
int a=1;
int b=2;
p2=add;
int c=p2(a,b);
printf("两数之和为:%d",c);
system("pause");
return 0;
}
运行结果:
无类型指针
要点
malloc——void * malloc(size_t size)
void并非表示没有,而是一种无类型的类型,使用时可以根据情况对其类型进行强制转换。例如:int* p=(int )malloc(nsizeof(int)),相当于指针数组。当前理解为:创建了元素个数为n个的整型数组p,且数组的指针变量为*p,指向数组的第一个元素。
示例
#include <stdio.h>
#include <stdlib.h>
int main()
{
//int a[3];
/* int *a=(int *)malloc(3*sizeof(int));//也是数组
int i;
for(i=0;i<3;i++)
{
a[i]=i;
}
for(i=0;i<3;i++)
{
printf("n=%d\n",a[i]);
} */
int n;
int i;
printf("请输入即将输入数组的个数:");
scanf("%d",&n);
// int a[n];
int *a=(int *)malloc(n*sizeof(int));//开辟n个整数型的地址 n*4
for(i=0;i<n;i++)
{
printf("请输入第%d同学的成绩:",i+1);
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
printf("第%d同学的成绩是:%d\n",i+1,*a++);
}
system("pause");
return 0;
}
运行结果:
内存泄露问题
malloc 进行空间申请之后不会自动释放掉申请的空间,只有程序结束后空间才可能被回收。
避免内存泄露
- 检查循环中有没有一直在申请空间
- 及时合理的释放空间 free(p);p=NULL;