一級指標,二級指標作為函式輸出形參的正確使用方法
/*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;
}