- 结构体设计
- typedef struct Student{
成员列表;
}Student,*PStu; -
- 结构体使用 成员访问
-
- Student s ={成员列表赋值};
-
s.成员 . 成员访问符
-
- Student s = {赋值};
-
PStu p = &s;
-
(*p).成员
-
p->成员
-
- 结构体和数组的结合
-
Student arr[]={{成员赋值},{成员赋值}};
-
- 结构体大小 -> 为什么内存对齐?
-
内存大小基本单位:字节
-
- 地址访问:cpu 内存读写不是按照1字节1字节读取
- 以2,4,8的倍数的字节块读取内存。
-
- 平台读取地址 偶数地址读取
-
- 不同平台 内存对齐方式不一样
-
- 结构体变量的首地址,必须是结构体变量中,最大基本数据类型的成员所占字节数 的整数倍。
- 结构体变量中每个成员相对结构体首地址的偏移量,都是该成员基本数据类型所占字节数的整数倍。
- 结构体总大小为结构体变量中最大基本数据类型所占字节的整数倍
- 基本数据类型(内置类型)
- 结构体类型 -> 自定义数据类型
- 设计一个类型 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]);
//}