# include <stdio.h>
/**
* 结构体
*/
//定义结构体
struct Student{
int id;
int age;
//用户名可以用指针指向一个字符串,也可以用char数组来存,如果是指针的话,那么数据不会存在结构体中,只会存放字符串的地址,
//但是如果是数组的话,数据会存放在结构体中
char* name;
};
//计算结构体在内存中占据的大小
struct Object {
// int a;
// short b;
// char c;
char a;
int b;
short c;
};
int main(){
//定义结构体变量
//结构体包含多种类型的数据(它们是一个整体),只需要把这些数据依次存放在花扩号中即可
struct Student s = {1,18,"小明"};
//如果数据只写一半,那么只会初始化其中一部分数据,剩余的内容相当于没有初始值,跟数组是一样的道理
struct Student s2 = {1,18};
//也可以指定去初始化哪一个属性,.变量名称 = 初始值
struct Student s3 = {1, .name = "白井"};
//打印结构体中的数据
printf("id = %d, age = %d, name = %s\n", s.id, s.age, s.name); //结构体变量.数据名称 (这里.也是一种运算符) 就可以访问结构体中存放的对应的数据了
//修改结构体中的数据
s.name = "白井";
s.age = 21;
printf("id = %d, age = %d, name = %s\n", s.id, s.age, s.name);
//计算数据在内存中占据大小
printf("int类型的大小是:%lu\n",sizeof(int));
printf("short类型的大小是:%lu\n",sizeof(short));
printf("char类型的大小是:%lu\n",sizeof(char));
//计算变量的值占据的大小
int arr[10];
printf("int arr[10]占据的内存大小是:%lu\n",sizeof(arr));//在判断非类型时,sizeof括号可省
//计算结构体类型占用的空间
printf("结构体Object占用的内存大小是:%lu",sizeof(struct Object));
//结果是12,难道结构体中有int、char、short,不应该是 4 + 1 + 2 = 7吗?
/**
* 实际上结构体的大小是遵循下面的规则来进行计算的:
* 结构体中的各个数据要求字节对齐,规则如下:
* **规则一:** 结构体中元素按照定义顺序依次置于内存中,但并不是紧密排列的。从结构体首地址开始依次将元素放入内存时,元素会被放置在其自身对齐大小的整数倍地址上(0默认是所有大小的整数倍)
* **规则二:** 如果结构体大小不是所有元素中最大对齐大小的整数倍,则结构体对齐到最大元素对齐大小的整数倍,填充空间放置到结构体末尾。
* **规则三:** 基本数据类型的对齐大小为其自身的大小,结构体数据类型的对齐大小为其元素中最大对齐大小元素的对齐大小。
*/
}
# include<stdio.h>
struct Student{
int id;
int age;
char* name;
};
//更改结构体的值
void test(struct Student * student){
student -> age = 19;
}
int main(){
//声明一个结构体类型的数组,其实和基本类型声明数组是一样的
//多个结构体数据用逗号隔开
struct Student arr[3] = {{1,21,"白井"},{2,21,"玄井"},{3,22,"黑井"}};
printf("%s\n",arr[1].name);
printf("%d\n",arr[0].id);
printf("-----------------------------------------------------------------------------------------\n");
/**
* 指向结构体的指针
*/
struct Student student = {4,22,"井池"};
struct Student * p = &student;
//由于.运算符优先级更高,所以获取地址上的值,要加()
printf("%s\n",(*p).name);
//不过以上的写法太累了,我们可以使用简便方法
printf("%s\n",p -> name);
test(&student);
printf("%d",student.age);
}