文章目录
1.结构体定义的三种方式:
1. 先声明结构体类型,再定义变量名:
#include <stdio.h>
struct student {
char name[50];
int age;
};
struct student s1 = { "alien", 18 };
int main() {
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
}
s1.name = alien, s1.age = 18
2. 在声明类型的同时定义变量名称:
struct student2 {
char name[50];
int age;
} s2 = { "alien", 20 }, s3 = { "alien003", 23 };
3.直接定义结构体类型变量(无类型名):
struct { // 没有设置结构体类型的名称
char name[50];
int age;
} s4 = { "alien", 20 };
2.结构体元素的赋值方式:
#include <stdio.h>
#include <string.h>
//结构体类型的定义
struct stu {
char name[50];
int age;
};
int main() {
struct stu s1;
struct stu* p = &s1;
strcpy(s1.name, "abc"); //结构体变量,通过点运算符操作结构体成员
s1.age = 18;
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
printf("==========================\n");
strcpy((&s1)->name, "test_first"); //如果是指针变量,通过->操作结构体成员
(&s1)->age = 22;
printf("(&s1)->name = %s, (&s1)->age = %d\n", (&s1)->name, (&s1)->age);
printf("==========================\n");
strcpy((*p).name, "test_second"); //指针可以通过点运算符,操作结构体成员
(*p).age = 25;
printf("(*p).name = %s, (*p).age=%d\n", (*p).name, (*p).age);
return 0;
}
s1.name = abc, s1.age = 18
==========================
(&s1)->name = test_first, (&s1)->age = 22
==========================
(*p).name = test_second, (*p).age=25
3.将结构体名作为函数的参数(不推荐)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//结构体变量名作为函数的参数
void set_stu(struct stu tmp) {
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
}
int main() {
struct stu s = { "other", 17};
set_stu(s); //将结构体的名称,传递给函数,相当于原始结构体的一个副本传递过去了
printf("s.name = %s, s.age = %d\n", s.name, s.age);
return 0;
}
tmp.name = alien, tmp.age = 18 //set_stu函数打印的内容
s.name = other, s.age = 17 //说明,main函数中的s变量的值,没有被set_stu函数修改
- 结构体变量名传递给函数,相当于只是把值传递给某个函数,个人感觉像是全局传递给了某个函数,但是函数本身没有把最终的参数传递给main函数
- 所以当函数运行完之后,函数修改之后结果,都随着内存的回收,消失了,相当于没有对main中的结构体s任何操作
- 最终在main中打印结构体信息的时候,s还是原始的内容
将函数体简单的修改之后:
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//结构体变量名作为函数的参数
struct stu set_stu(struct stu tmp) {
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return tmp;
}
int main() {
struct stu s = { "other", 17};
struct stu s_new = set_stu(s); //将结构体的名称,传递给函数,相当于原始结构体的一个副本传递过去了
printf("s_new.name = %s, s_new.age = %d\n", s_new.name, s_new.age);
return 0;
}
tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18 // 说明main中的结构体s被修改了
4.将结构体的指针作为函数的参数(推荐)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//结构体变量名作为函数的参数
void set_stu(struct stu *tmp) {
strcpy(tmp->name, "alien");
tmp->age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp->name, tmp->age);
}
int main() {
struct stu s = { "other", 17};
set_stu(&s); //将结构体的指针,传递给函数
printf("s_new.name = %s, s_new.age = %d\n", s.name, s.age);
return 0;
}
tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18 // 通过指针,成功的把main函数中的结构体s修改了值
5.在函数中初始化结构体:再把指针传递(不推荐)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
struct stu * set_stu() {
struct stu tmp;
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return &tmp; // 将栈上创建的结构体指针,传递出去
}
int main() {
struct stu s = { "other", 17};
struct stu * p = set_stu(); //相当于指针p去接收另一个函数在栈上创建的指针
printf("p->name = %s, p->age = %d\n", p->name, p->age);
printf("p->name = %s, p->age = %d\n", p->name, p->age);
return 0;
}
tmp.name = alien, tmp.age = 18
p->name = 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫, p->age = 18
p->name = 烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫, p->age = 7339044
- 因为函数set_stu初始化的结构体是临时变量,是在栈上创建的,随着函数的结束,最终这个结构体变量的内存被回收
- 在main中,指针p接收到的内容就什么都没有了
- 最终结构体里面,都是随机数了(初始化状态默认给的是随机值)
6.在函数中初始化结构体:再把结构体传递出去(推荐)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
struct stu set_stu() {
struct stu tmp;
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return tmp; // 在栈上创建的结构体传递出去
}
int main() {
struct stu s = { "other", 17};
struct stu new_tmp = set_stu(); //相当于将结构体,传递给另一个结构体
printf("new_tmp.name = %s, new_tmp.age = %d\n", new_tmp.name, new_tmp.age);
return 0;
}
tmp.name = alien, tmp.age = 18
new_tmp.name = alien, new_tmp.age = 18