结构体(就是Java的对象类)

声明一个结构体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) 由于不同平台对齐方式可能不同,如此-来,同样的结构在不同的平台其大小可能不同,在无意识的情况下题互相发送的数据可能出现错乱,甚至引发严重的问

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值