一级指针,二级指针作为函数输出形参的正确使用方法

/*data:20181218

/*
 * 一级指针函数输出形参的正确使用方法:

*1)用于将函数内部的地址拷贝到函数外部已经分配的地址,有两种做法,参照test_demo_has_no_ininer_static()和test_demo_has_local_var(),经过代码对比可以发现test_demo_has_no_ininer_static()更合适
 *  二级指针函数输出形参的正确使用方法:

1)用于将函数内部局部static变量(程序结束前不会消亡),的地址传输出去用的,且传输出去的指针地址指向函数内部static变量地址,参考test_demo_has_ininer_static()
 * */

#include <iostream>
#include<math.h>
#include <memory.h>
using namespace std;
#define max_buf_size 1024

struct sum_input_param
{
    int front_facotr;
    int back_factor;
};

struct sum_out_param
{
    int result;
    char buf[max_buf_size];
};

struct sum_struct
{
    sum_input_param *pinput_param;
    sum_out_param *pout_param;//在使用之前需要给他赋内存地址
};


int test_demo_has_no_ininer_static(int a,int b);

int test_demo_has_ininer_static(int a,int b);
int test_demo_has_local_var(int a,int b);
int cacu_sum_condition_fun_has_inner_static(int a,int b, sum_out_param **pout_param);

int cacu_sum_condition_fun_has_no_ininer_static(int a,int b, sum_out_param *pout_param);

int cacu_sum_condition_fun_has_local_var(int a,int b, sum_out_param *pout_param);
int main(int argc, char *argv[])
{
    //test_demo_has_ininer_static(1,2);
    //test_demo_has_local_var(1,2);

    for(int i=0;i<5;i++)
    {
        test_demo_has_no_ininer_static(i,1);

    }

    return 0;
}

int test_demo_has_no_ininer_static(int a,int b)
{
    static sum_struct tsum_struct;
    static sum_input_param input_param;
    static sum_out_param   out_param;
    tsum_struct.pinput_param =   &input_param;//在开始阶段就要给指针赋内存地址
    tsum_struct.pout_param   =   &out_param;

    sum_input_param *pinput_param=(sum_input_param *)tsum_struct.pinput_param;

    sum_out_param *pout_param=tsum_struct.pout_param;
    //sum_out_param *pout_param;

    cacu_sum_condition_fun_has_no_ininer_static(a,b,pout_param);
    int c=0;


    cout<<pout_param->buf<<endl;
      cout<<pout_param->result<<endl;

    cout << "Hello World!" << endl;

}


int test_demo_has_ininer_static(int a,int b)
{
    static sum_struct tsum_struct;
    static sum_input_param input_param;
    static sum_out_param   out_param;
    tsum_struct.pinput_param =   &input_param;//在开始阶段就要给指针赋内存地址
    tsum_struct.pout_param   =   &out_param;//在开始阶段就要给指针赋内存地址

    sum_input_param *pinput_param=(sum_input_param *)tsum_struct.pinput_param;


   sum_out_param *pout_param;

    cacu_sum_condition_fun_has_inner_static(a,b,&pout_param);
    cout<<pout_param->buf<<endl;
    cout<<pout_param->result<<endl;
    int temp=0;
    return 0;

}

int test_demo_has_local_var(int a,int b)
{


    static sum_struct tsum_struct;
    static sum_input_param input_param;
    static sum_out_param   out_param;
    tsum_struct.pinput_param =   &input_param;//在开始阶段就要给指针赋内存地址
    tsum_struct.pout_param   =   &out_param;

    sum_input_param *pinput_param=(sum_input_param *)tsum_struct.pinput_param;

   sum_out_param *pout_param = tsum_struct.pout_param;//赋地址,分配内存,为了从函数内部拷贝出来一份
    //sum_out_param *pout_param;

    cacu_sum_condition_fun_has_local_var(a,b,pout_param);
    int c=0;


    cout<<pout_param->buf<<endl;

    cout << "Hello World!" << endl;

}
int cacu_sum_condition_fun_has_inner_static(int a,int b, sum_out_param* *pout_param)
{
        //二级指针为了把static的内存地址传出去
        static sum_struct tsum_struct;
        static sum_input_param input_param;
        static sum_out_param   out_param;//函数内部的static内存不会被销毁
        tsum_struct.pinput_param =   &input_param;//在开始阶段就要给指针赋内存地址
        tsum_struct.pout_param   =   &out_param;
        sum_out_param* pinner_out_param=(sum_out_param *)tsum_struct.pout_param;
        *pout_param=pinner_out_param;
        char *info=pinner_out_param->buf;
        memset(info,0,max_buf_size*sizeof(char));
        pinner_out_param->result= a+b;
        strcpy(info,"finish sum!\n");
        int temp=0;
        return 0;
}

int cacu_sum_condition_fun_has_no_ininer_static(int a,int b, sum_out_param *pout_param)
{
    sum_out_param *pinner_out_param=pout_param;
    char *info=pinner_out_param->buf;
    memset(info,0,max_buf_size*sizeof(char));
    pinner_out_param->result= a+b;
    strcpy(info,"finish sum!\n");
    int temp=0;
    return 0;

}


int cacu_sum_condition_fun_has_local_var(int a,int b, sum_out_param *pout_param)
{
    sum_struct tsum_struct;
    sum_input_param input_param;
    sum_out_param   out_param;
    tsum_struct.pinput_param =   &input_param;//在开始阶段就要给指针赋内存地址
    tsum_struct.pout_param   =   &out_param;//单级指针用于内存拷贝,将函数内部的拷贝到外部去
    //两级指针用于将内部staitc拷贝到完那布
    sum_out_param *pinner_out_param=(sum_out_param *)tsum_struct.pout_param;
    //*pout_param=pinner_out_param;

    char *info=pinner_out_param->buf;
    memset(info,0,max_buf_size*sizeof(char));
    pinner_out_param->result= a+b;
    strcpy(info,"finish sum!\n");

    int temp2=0;
    memcpy(pout_param,pinner_out_param,sizeof(sum_out_param));//将结果拷贝到输出指针指向的位置
    return 0;

}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值