结构体aa

本文详细解析了结构体设计,包括typedef的使用、成员访问、结构体数组与内存对齐原理。探讨了结构体大小与内存布局的关系,并提供了实例演示,涵盖了自定义数据类型(如Student类型)、内存对齐规则以及不同类型数组的排序算法。
摘要由CSDN通过智能技术生成
  1. 结构体设计
  • typedef struct Student{
    成员列表;
    }Student,*PStu;
    1. 结构体使用 成员访问
    1. Student s ={成员列表赋值};
  •  s.成员     . 成员访问符
    
    1. Student s = {赋值};
  •  PStu p = &s;
    
  • (*p).成员
    
  •  p->成员
    
    1. 结构体和数组的结合
  • Student arr[]={{成员赋值},{成员赋值}};
    
    1. 结构体大小 -> 为什么内存对齐?
  • 内存大小基本单位:字节
    
    1. 地址访问:cpu 内存读写不是按照1字节1字节读取
  • 以2,4,8的倍数的字节块读取内存。
    1. 平台读取地址 偶数地址读取
    1. 不同平台 内存对齐方式不一样
    1. 结构体变量的首地址,必须是结构体变量中,最大基本数据类型的成员所占字节数 的整数倍。
  1. 结构体变量中每个成员相对结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍。
  2. 结构体总大小为结构体变量中最大基本数据类型所占字节的整数倍
  • 基本数据类型(内置类型)
  • 结构体类型 -> 自定义数据类型
  • 设计一个类型 int
    struct 类型名{
    属性(变量的声明)
    };
    设计一个学生类型: //类型的设计 不占内存 类型定义变量才占内存空间
    struct Student{ int num = 0;
    char name[10]; //成员列表(属性)
    int age;
    int score;
    };

struct Student stu = {“zs”,10,100};

struct Student{
const char* name; //???
int age;
int score;
};
struct Student stu = {“zs”,10,100};
/
//#include <stdio.h>
//#include <string.h>
// typedef类型重命名
//struct Student {
// const char
name;
// int age;
// int score;
//};
//
//typedef struct Student Student;

//int main() {
// //定义一个结构体变量, . 成员访问符
// struct Student stu = { “zs”,10,100 };
// struct Student stu2;
// stu2 = { “lisi”,9,99 };
// //通过结构体变量来进行成员的访问:
// printf(“%s\n”, stu.name);
//
// //定义一个结构体类型的数组,赋值,数据打印:第…个学生姓名,年龄
// //struct Student arr[] = { {“zs”,10,100},{“lisi”,9,99},{“ww”,8,88}};
// struct Student arr[] = { stu,stu2,{“ww”,8,88} };
// int len = sizeof(arr) / sizeof(arr[0]);
// for (int i = 0; i < len; i++) {
// printf(“第%d个学生:姓名:%s 年龄:%d\n”, i + 1, arr[i].name, arr[i].age);
// }
//
//}

//struct Student {
// const char* name;
// int age;
// int score;
//};
//typedef struct Student Student;
//typedef struct Student* PStu;
//等价于下方 类型的重命名

//typedef struct Student {
// const char* name;
// int age;
// int score;
//}Student, * PStu;
//
//int main() {
// Student s = {“zs”,10,100};
// // s.name;
// //结构体和指针结合
// //struct Student* ptr = &s;
// PStu ptr = &s;
// printf(“%s\n”,(*ptr).name); //1
// printf(“%s\n”,ptr -> name); //2 1 2 效果相同 -> 指向符具有解引用功能
//}

//按照学生的成绩对学生数组进行冒泡排序(升序)
// 若成绩相同,按照姓名(降序排序)
//“zs”, 100 “lisi” ,100 “ww”, 99
//ww 99 zs 100 lisi 100
//void Swap(int* a, int* b) {
// int temp = *a;
// *a = *b;
// b = temp;
//}
//
//void BubbleSort(int
arr, int len) {
// int flag = 0;
// for (int i = 0; i < len; i++) { //趟数
// flag = 0;
// for (int j = 0; j < len - 1 - i; j++) {
// if (arr[j] > arr[j + 1]) {
// Swap(&arr[j], &arr[j + 1]);
// flag = 1;
// }
// }
// if (!flag)
// break;
// }
//}
//
//int main() {
// int arr[] = { 1,4,2,4,6,8,1 }; // 1 2 3 4
// int len = sizeof(arr) / sizeof(arr[0]);
// BubbleSort(arr,len);
//
//}

//typedef struct Student {
// const char* name;
// int score;
// int age;
//}Student;

//typedef Student ElemType;
//
//void Swap(ElemType* a, ElemType* b) {
// ElemType temp = *a;
// a = b;
// b = temp;
//}
//不同类型的一维数组
//void BubbleSort(ElemType
arr, int len) {
// int flag = 0;
// for (int i = 0; i < len; i++) { //趟数
// flag = 0;
// for (int j = 0; j < len - 1 - i; j++) {
// if (arr[j].score > arr[j + 1].score) {
// Swap(&arr[j], &arr[j + 1]);
// flag = 1;
// } //成绩相同,按照姓名 降序排序
// else if (arr[j].score == arr[j + 1].score) {
// if (strcmp(arr[j].name, arr[j + 1].name) < 0) {
// Swap(&arr[j], &arr[j + 1]);
// }
// }
// }
// if (!flag)
// break;
// }
//}
//
//int main() { // ww zs lisi
// Student arr[] = {
// {“lisi”,100,9},{“zs”,100,10},{“ww”,88,9}
// }; // 1 2 3 4
// int len = sizeof(arr) / sizeof(arr[0]);
// BubbleSort(arr, len);
// for (int i = 0; i < len; i++) {
// printf(“%s %d\n”,arr[i].name,arr[i].score);
// }
//
//}
//void Swap(int
pa, int
pb) {
// int temp = *pa;
// *pa = pb;
// pb = temp;
//}
//
//void Swap2(int
arr, int i, int j) {
// int temp = arr[i]; //
(arr+i)
// arr[i] = arr[j];
// arr[j] = temp;
//}
//
//int main() {
// int arr[] = { 0,1 };
// //Swap(&arr[0],&arr[1]);
// Swap2(arr, 0, 1);
// printf("%d %d ",arr[0],arr[1]);
//}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值