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