使用结构体传值:
1.形参是结构体变量,值传递
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct programer{
char name[32];
int age;
int salary;
};
//形参是结构体变量,值传递
struct programer add_salary1(struct programer p, int num){
p.salary += num;
return p;
}
int main(void){
struct programer xiaoniu;
strcpy(xiaoniu.name, "小牛");
xiaoniu.age = 28;
xiaoniu.salary = 20000;
//结构体变量做为参数传值是值传递,和 int 等基本类型一样
xiaoniu = add_salary1(xiaoniu, 5000);
//xiaoniu.salary的值没有任何改变
printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age, xiaoniu.salary);
system("pause");
return 0;
}
在这个程序中,打印出的xiaoniu.salary的值没有任何改变,能改变它的值的是以下三种方式。
至于为什么没有改变, 那是因为被调用函数的变量是被调用函数的,主函数中的变量时主函数中的,两者只是值的传递,没有任何关联!
2.形参使用结构体指针
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct programer{
char name[32];
int age;
int salary;
};
//形参使用结构体指针
void add_salary2(struct programer *p, int num){
if(!p) return ;
p->salary += num;
}
int main(void){
struct programer xiaoniu;
strcpy(xiaoniu.name, "小牛");
xiaoniu.age = 28;
xiaoniu.salary = 20000;
//指针传值
add_salary2(&xiaoniu, 5000);
printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age, xiaoniu.salary);
system("pause");
return 0;
}
3.形参使用引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct programer{
char name[32];
int age;
int salary;
};
//形参使用引用
void add_salary3(struct programer &p, int num){
p.salary += num;
}
int main(void){
struct programer xiaoniu;
strcpy(xiaoniu.name, "小牛");
xiaoniu.age = 28;
xiaoniu.salary = 20000;
//指针传值
add_salary3(xiaoniu, 5000);
printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age, xiaoniu.salary);
system("pause");
return 0;
}
4.形参是结构体变量,值传递,返回引用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct programer{
char name[32];
int age;
int salary;
};
//形参是结构体变量,值传递,返回引用
struct programer& add_salary4(struct programer p, int num){
p.salary += num;
return p;
}
int main(void){
struct programer xiaoniu;
strcpy(xiaoniu.name, "小牛");
xiaoniu.age = 28;
xiaoniu.salary = 20000;
//指针传值
xiaoniu = add_salary4(xiaoniu, 20000);
printf("姓名: %s, 年龄: %d, 薪水: %d\n", xiaoniu.name, xiaoniu.age, xiaoniu.salary);
system("pause");
return 0;
}
注意: 一般不建议把结构体直接作为函数参数。
因为结构体的 size 比较大,直接传递,消耗性能!
解决方案:(使用指针和引用,优先使用引用)