1. 程式人生 > >一級指標,二級指標作為函式輸出形參的正確使用方法

一級指標,二級指標作為函式輸出形參的正確使用方法

/*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;

}