深入理解c指针_学习笔记_3.0指针和函数

第二章地址:深入理解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;
}

函数指针数组
我不喜欢这种,用到时再看吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值