结构体-结构体对齐-结构体数组
结构体的定义、初始化、结构体数组
C语言提供结构体来管理不同类型的数据组合。
cs
#include <stdio.h>
struct student{
int num;
char name[20];
char sex;
int age;
float score;
char addr[30];
};//结构体类型声明,注意最后一定要加分号
int main() {
struct student s = {1001,"ali",'M',20,99,"Shanghai"};
struct student sarr[3];//定义一个结构体数组变量
int i;
//结构体输出必须单独去访问内部成员
printf("%d %s %c %d %5.2f %s\n",s.num,s.name,s.sex,s.age,s.score,s.addr);
printf("--------------------------");
// scanf("%d%s %c%d%f%s",&s.num,s.name,&s.sex,&s.age,&s.score,s.addr);
for(i = 0;i < 3;i++){
scanf("%d%s %c%d%f%s",&sarr[i].num,sarr[i].name,&sarr[i].sex,&sarr[i].age,&sarr[i].score,sarr[i].addr);
}
for(i = 0;i <3;i++){//结构体数组的输出
printf("%d %s %c %d %.2f %s\n",sarr[i].num,sarr[i].name,sarr[i].sex,sarr[i].age,sarr[i].score,sarr[i].addr);
}
// printf("%d %s %c %d %f %s",s.num,s.name,s.sex,s.age,s.score,s.addr);
return 0;
}
//输出
1001 ali M 20 99.00 Shanghai
--------------------------
2000 lilil M 22 63 Shanghai
3025 dave F 22 36 Beijing
5362 dliv F 23 32 Hangzhou
2000 lilil M 22 63.00 Shanghai
3025 dave F 22 36.00 Beijing
5362 dliv F 23 32.00 Hangzhou
Process finished with exit code 0
❗ 如果结构体变量已经定义,那么只能对它的每个成员变量单独赋值,如s.nun = 1003;
结构体对齐
👩💻 结构体的大小必须是其最大成员的整数倍!
为什么要对齐?为了CPU高效的去取内存上的数据
cs
#include <stdio.h>
struct student_type1{
//double是一种浮点类型,8个字节,浮点分为double和float
double score;
short age;//short是整型,占2个字节
};
struct student_type2{
double score;
int height;//如果两个小存储之和是小于最大长度8,那么它们就结合在一起
short age;
};
struct student_type3{
int height;
char sex;
short age;
};
//结构体对齐
int main() {
struct student_type1 s1;
struct student_type2 s2;
struct student_type3 s3;
printf("s1 size = %d\n", sizeof(s1));
printf("s2 size = %d\n", sizeof(s2));
printf("s3 size = %d\n", sizeof(s3));
return 0;
}
//输出
s1 size = 16
s2 size = 16
s3 size = 8
结构体指针与typedef的使用
结构体指针
一个结构体变量的指针就是该变量所占据的内存段的起始地址。指针变量也可以用来指向结构体数组中的元素,从而能够通过结构体指针快速访问结构体内的每个成员。
cs
#include <stdio.h>
struct student{
int num;
char name[20];
char sex;
};
//结构体指针
int main() {
struct student s = {100,"alli",'M'};
struct student sarr[3]={1001,"zhangsan",'F',2500,"lisi",'M',6322,"qiaorv",'M'};
struct student *p;//定义结构体指针
p = &s;
printf("%d %s %c\n",(*p).num,(*p).name,(*p).sex);//方式一通过结构体指针去访问成员
printf("%d %s %c\n",p->num,p->name,p->sex);//优先使用
p = sarr;
printf("%d %s %c\n",p->num,p->name,p->sex);
printf("-------------------------------------\n");
p = p + 1;
printf("%d %s %c\n",p->num,p->name,p->sex);
return 0;
}
//输出
100 alli M
100 alli M
1001 zhangsan F
-------------------------------------
2500 lisi M
typedef的使用
cs
#include <stdio.h>
//stu 等价于 struct student,pstu等价于 struct student*;
typedef struct student{
int num;
char name[20];
char sex;
}stu,*pstu;
typedef int LLLL;//特定地方使用
//typedef的使用
int main() {
stu s = {1001,"wangle",'M'};
stu *p = &s;//定义了一个结构体指针变量
pstu p1 = &s;//定义了一个结构体指针变量
LLLL num = 10;
printf("num = %d,p -> num = %d\n",num,p -> num);
return 0;
}
//输出
num = 10,p -> num = 1001
C++引用
C++的引用
对于C++,首先新建源文件时,名字需要叫main.cpp,以cpp后缀结尾
在子函数内修改主函数的普通变量的值
cpp
#include <stdio.h>
//C++引用
//在子函数内修改主函数的普通变量的值
//当在子函数中要修改主函数中的值,就用引用
void modify_num(int &b){//形参中写&,要称为引用
b = b + 1;
}
int main() {
int a = 10;
modify_num(a);
printf("after modify_num = %d\n",a);
return 0;
}
//输出
after modify_num = 11
在子函数内修改主函数的一级指针变量
cpp
#include <stdio.h>
void modify_pointer(int *&p,int *q){
p = q;
}
//子函数内修改主函数的一级指针变量
int main() {
int *p = NULL;
int i = 10;
int *q = &i;
modify_pointer(p,q);
printf("after modify_pointer = %d\n",*p);
return 0;//进程已结束,推出代码为-1073741819,不为0,那么代表进程异常结束
}
//输出
after modify_pointer = 10
Process finished with exit code 0
C++的布尔类型
cpp
#include <stdio.h>
int main() {
bool a = true;
bool b = false;
printf("a = %d,b = %d\n",a,b);
return 0;
}
//输出
a = 1,b = 0