第二章地址:深入理解c指针_学习笔记_2.0动态内存分配
https://blog.csdn.net/haimaer/article/details/81450657
1:在使用函数时,有2种情况指针很有用
1、指针作为参数传递,函数可以使用指针引用的数据,也可以高效的传递大块数据。
2、声明函数指针。
2:程序的栈与堆
程序栈是支持函数运行的内存区域,通常和堆共享内存,栈用这块内存的下部,堆用上部。
栈帧存放函数参数和局部变量,堆管理动态内存。
3:在函数中返回(return) 局部变量数组或数据,返回的是一个不确定的值,局部变量在栈帧中生存,在函数退出后会自动弹出消失。
所以这种情形可以使用传递数组指针来实现,
4:局部变量的作用域只有在函数内,在实际中经常忽略这类问题,返回一个局部变量,导致异常。
若需要修改指针地址,则我们要传递 :指针的指针
5:自定义个free函数
此函数有很大的参考意义,在free空间时可以用来作为自定义函数。如果地址已经释放会跳过,不予理会。
这比直接使用free()会有更好的容错性,万一释放一个已经释放的空间,会导致报错。
下面标出的宏定义比较实用,值得参考!!!
6:函数指针 实际运用
#include<stdio.h>
//------------------------------------------------------------------------
#if 0 //最基础的函数指针运用
//int (*fptr)(int);
typedef int (*funcptr)(int);//函数类型定义
int square(int num)//求平方的函数
{
return num*num;
}
int main()
{
funcptr fptr;
int n = 5;
fptr=square;//调用函数
printf("%d square is %d\n",n,fptr(n));
return 0;
}
#endif
//------------------------------------------------------------------------
//传递函数指针运用
#if 0
int add(int num1,int num2)
{
return num1 + num2;
}
int subtract(int num1,int num2)
{
return num1 - num2;
}
typedef int (*funcptr)(int,int);
int compute(funcptr fptr,int num1,int num2)
{
return fptr(num1,num2);
}
int main()
{
printf("%d\n",compute(add,5,6));
printf("%d\n",compute(subtract,5,6));
return 0;
}
//使用函数指针,可以让程序看上去更加灵活
#endif
//------------------------------------------------------------------------
//返回函数指针,将函数指针作为返回值
int add(int num1,int num2)
{
return num1 + num2;
}
int subtract(int num1,int num2)
{
return num1 - num2;
}
typedef int (*funcptr)(int,int);
//选择需要用到的函数类型
funcptr select(char opcpde)
{
switch(opcpde)
{
case '+':return add;
case '-':return subtract;
}
}
//搞一个链接函数,将这些函数联系起来
int evaluate(char opcode,int num1,int num2)
{
funcptr operation = select(opcode);
return operation(num1,num2);
}
int main()
{
printf("%d \n",evaluate('+',5,6));
printf("%d \n",evaluate('-',5,6));
return 0;
}
函数指针数组
我不喜欢这种,用到时再看吧