结构体
1.1 为什么要使用“结构”(结构体)
但需要表示一些复杂信息时,使用单纯的数据类型很不方便。
比如:学生信息(学号,姓名,班级,电话,年龄)
1.2 什么是“结构”
结构,就是程序员自定义的一种“数据类型”
是使用多个基本数据类型、或者其他结构,组合而成的一种新的“数据类型”。
1.3 结构体的定义
struct 结构名 {
成员类型 成员名;
成员类型 成员名;
};
实例:
struct student{
char name[16];
int age;
char tel[12];
};
特别注意:
1)要以 struct 开头
2)最后要使用分号
3)各成员之间用分号隔开
1.4 结构的初始化
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//结构, 就是程序员自定义的一种"数据类型"
struct student{
char name[16];
int age;
char tel[12];
};
//结构体包含结构体的情况
struct _class{
struct student weifc;
struct student weimk;
struct student weikc;
};
int main(){
//结构体的初始化
//方式一 定义的时候初始化所有的属性
struct student weifc = {"weifc", 19, "10086"};
printf("rock 的姓名: %s 年龄: %d 电话: %s\n", weifc.name, weifc.age, weifc.tel);
//方式二 定义的时候我们可以指定初始化的属性vs/vc不支持 gcc支持
//struct student s1 ={.name="张三丰",.age = 100};
//方式三 单独初始化每一个属性
struct student s2;
strcpy(s2.name, "杨过");
s2.age = 40;
s2.tel[0] = '\0';
printf("杨过的姓名: %s 年龄: %d 电话: %s\n", s2.name, s2.age, s2.tel);
struct _class c1 = {{"weifc", 19, "*****"},
{"weimk", 20, "*******"},
{"weikc", 100, ""}};
printf("c1班weifc 同学姓名: %s 年龄: %d 电话: %s\n",
c1.weifc.name, c1.weifc.age, c1.weifc.tel);
system("pause");
return 0;
}
使用形式:
结构体变量.成员变量
中间用 . 分隔
运行结果:
1.5 结构的使用
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char name[16];
int age;
};
int main(){
struct student s1, s2;
printf("请输入第一个学生的姓名: \n");
scanf_s("%s", s1.name, sizeof(s1.name));
printf("请输入第一个学生的年龄: \n");
scanf("%d", &s1.age);
printf("第一个学生的姓名: %s, 年龄: %d\n", s1.name, s1.age);
//结构体的小秘密, 结构体变量之间可以直接赋值
//s2 = s1;
memcpy(&s2, &s1, sizeof(struct student));
printf("第二个学生的姓名: %s, 年龄: %d\n", s2.name, s2.age);
char c1[16] = {"weifc"}, c2[16];
//c2 = c1; 数组不能直接赋值
system("pause");
return 0;
}
运行结果:
2.6 结构数组
struct 结构名 变量名[数组大小]
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct student{
char name[16];
int age;
};
int main(){
struct student s[2];
printf("请输入第一个学习姓名: \n");
scanf_s("%s", s[0].name, sizeof(s[0].name));
printf("请输入第一个学生的年龄: \n");
scanf("%d", &s[0].age);
printf("第一个学生的姓名: %s, 年龄: %d\n", s[0].name,s[0].age);
//结构体的小秘密, 结构体变量之间可以直接赋值
s[1] = s[0]; //方式1
//memcpy(&s[1], &s[0], sizeof(struct student)); //方式二
printf("第二个学生的姓名: %s, 年龄: %d\n", s[1].name,s[0].age);
system("pause");
return 0;
}
1.7 指向结构体的指针
使用结构体变量址指针访问结构体成员要使用 -> 符号
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct _friend{
char name[32];
char sex; // m - 男 f - 女
int age;
};
int main(void){
struct _friend girl = {"小龙女", 'f', 18};
struct _friend *my_girl = &girl;
printf("小龙女的名字: %s 性别: %s 年龄: %d\n",
girl.name,girl.sex=='m'?"男":"女", girl.age);
//指针访问结构体变量的成员, 有两种方式
//方式1. 直接解引
printf("小龙女的姓名: %s 性别: %s 年龄: %d\n", (*my_girl).name,
(*my_girl).sex=='m'?"男":"女", (*my_girl).age);
//方式2. 直接使用指针访问 ->
printf("小龙女的姓名: %s 性别: %s 年龄: %d\n", my_girl->name,
my_girl->sex=='m'?"男":"女", my_girl->age);
system("pause");
return 0;
}
***实际开发中***常用 -> 符通过指针去访问结构体指针变量的成员
运行结果:
1.8 使用结构体传递值
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct programer{
char name[32];
int age;
int salary;
};
//形参是结构体变量, 值传递
struct programer add_salary(struct programer p, int num){
p.salary += num;
return p;
}
//形参使用结构体指针
void add_salary1(struct programer *p, int num){
if(!p) return;
p->salary += num;
}
//形参使用引用
void add_salary2(struct programer &p, int num){
p.salary += num;
}
//形参是结构体变量, 值传递, 返回引用
struct programer& add_salary3(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_salary(xiaoniu, 5000);
//指针传值
//add_salary1(&xiaoniu, 5000);
//引用传值
//add_salary2(xiaoniu, 10000);
//返回引用
xiaoniu = add_salary3(xiaoniu, 20000);
printf("姓名: %s, 年龄: %d, 薪资: %d\n", xiaoniu.name,
xiaoniu.age, xiaoniu.salary);
system("pause");
return 0;
}
注意:
一般不建议把结构体直接作为函数参数。
因为结构体的 size 比较大,直接传递,消耗性能!
解决方案:(使用指针和引用,优先使用引用)
运行结果:
结语:
大家对学到的知识要, 多复习, 多总结, 多敲.
我是小白, 如果存在问题, 欢迎大神给予评判指正.
错了不可怕, 可怕的是找不出bug