声明一个结构体struct
struct Sturdent{
//成员变量
char name[20];
int age;
double score;
}
初始化结构体变量(无参构造???)
Student stu = {
"zs",10,99.5
}
访问成员变量
修改成员变量
#include <stdio.h>
struct User {
long long man_id;
char name[30];
char phone[20];
};
int main() {
User user = { 1,"zzz","1111111" };
user.man_id = 2;
printf("%d", user.man_id);
return 0;
}
结构体的嵌套及声明
#include <stdio.h>
struct User {
long long man_id;
char name[30];
char phone[20];
};
struct Card {
int id;
double money;
long password;
User user;
};
int main() {
Card card1 = {
1,9.9,888888,{33333333333333,"张","18999174627"}
};
card1.id = 3;
printf("%c", *card1.user.name);
return 0;
}
结构体数组化(便于操作结构体之间的关系)
#include <stdio.h>
struct Student {
char name[30];
int stu_id;
double score;
};
int main() {
Student stu1 = { "张三",1,99.5 };
Student stu2 = { "李四",2,88.5 };
Student stu3 = { "王五",3,66.5 };
Student arr[] = { stu1,stu2,stu3 };
return 0;
}
简单的结构体操作案例(银行卡)
类似于Java的架构:工具类,执行类,信息类,对象类
Array.h头文件用于声明结构体以及函数声明也可以定义宏
#pragma once //跟平台有关
//预处理指令 防止头文件重复引用
//.h 头文件 结构体设计 宏定义
//#define ARRAY_H
//#ifndef ARRAY_H
#define INITSIZE 3
struct User {
char u_name[20];
char u_word[30];
int u_age;
};
typedef struct Card {
//属性 (成员变量)
char c_name[20];
long c_userword;
long c_password;
double c_money;
struct User user;
}Card;
//函数声明
void Init(Card* pstu, char* c1_name, long userword, long password, double money, char* u1_name, char* word, int age);
void Swap(Card* p1, Card* p2);
void BubbleSort(Card* arr, int len);
//#endif
ImpArray.cpp用于实现函数的cpp文件《工具类》
#define _CRT_SECURE_NO_WARNINGS
#include "Array.h"
#include <stdio.h>
#include <string.h>
#include <cassert>
void Init(Card* pstu, char* c1_name, long userword, long password, double money, char* u1_name,char* word,int age)
{
assert(pstu != NULL);
int a = 0;
pstu->c_userword = userword;
pstu->c_password = password;
pstu->c_money = money;
pstu->user.u_age = age;
strcpy(pstu->c_name, c1_name);
strcpy(pstu->user.u_name, u1_name);
strcpy(pstu->user.u_word, word);
}
void Swap(Card* p1, Card* p2) {
Card temp = *p1;
*p1 = *p2;
*p2 = temp;
}
//按照学生总成绩排序升序 若成绩相同 按照姓名降序
void BubbleSort(Card* arr, int len) {
assert(arr != NULL);
bool flag;
for (int i = 0; i < len - 1; i++) {
//每一趟
flag = false; //判断每一趟是否存在交换 --- 剩余数据是否完全有序
for (int j = 0; j < len - 1 - i; j++) {
if (arr[j].c_money > arr[j + 1].c_money) {
flag = true;
Swap(&arr[j], &arr[j + 1]);
}
else if (arr[j].c_money == arr[j + 1].c_money
&& arr[j].user.u_age< arr[j+1].user.u_age) {
flag = true;
Swap(&arr[j], &arr[j + 1]);
}
}
if (!flag) {
break;
}
}
}
main.cpp测试类《用于写程序》
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include "Array.h"
Card arr[INITSIZE];
int main() {
char c1_name[20], u1_name[20], word[30];
int age;
long userword, password;
double money;
for (int i = 0; i < INITSIZE; i++) {
printf("银行卡名,账号,密码,余额,储户姓名,身份证号,年龄: ");
scanf("%s%ld%ld%lf%s%s%d", c1_name, &userword, &password, &money, u1_name, word, &age);
Init(&arr[i], c1_name, userword, password, money, u1_name, word, age);
}
BubbleSort(arr, INITSIZE);
for (int i = 0; i < INITSIZE; i++) {
printf("银行卡名:%s,账号:%d,密码:%d,余额:%.1f,储户姓名:%s,身份证号:%s,年龄:%d\n",
arr[i].c_name, arr[i].c_userword, arr[i].c_password, arr[i].c_money, arr[i].user.u_name, arr[i].user.u_word, arr[i].user.u_age);
}
}
结构体大小(面试)见面试合集
为什么要理解字节对齐问题
1)内存大小的基本单位是字节 (byte),理上来讲,可以从任意地址访问变量,但是实际上,cup 并非逐字节内存,因此就会对基本数据类型的地址作出一些限制,即它的地址必读写内存,而是以2,4,或8的倍数的字节块来读按照一定的规则在空间上排列,这就是对齐须是2,4或8的倍数。那么就要求各种数据类型个int型(假设为32位系统)如果存放在偶地址开始的地方
2)有些平台每次读都是从偶地址开始,如果么一个读周期就可以读出这 32bit,而如果存放在奇地址开始的地方,就需要2个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit 数据。显然在读取效率上下降很多
3) 由于不同平台对齐方式可能不同,如此-来,同样的结构在不同的平台其大小可能不同,在无意识的情况下题互相发送的数据可能出现错乱,甚至引发严重的问