1.c语言基础之结构体概念
1.1为什么需要结构体
普通变量 整型 字符型 无法满足业务场景,需要自创数据类型。
1.2c语言基础之结构体语法规则
1.2.1 结构体名字首字母大写,做到区分。
1.2.2 自创数据后,结尾一定要加分号。
1.2.3 什么叫自创数据类型,已有的如int,char,我们自创的struct Student 才是自创的数据类型。
1.3 c语言基础之指向结构体的指针
struct Student *p; 用 ->l来引用结构体中的成员。
1.4 c语言基础之引起段错误的原因
1.4.1 操作野指针
1.4.2操作指向NULL的指针
1.5 C语言基础之结构体大小的计算原则
1.5.1 原则1
- 结构体中元素是按照定义顺序一个一个放到内存中去的,但并不是紧密排列的。从结构体存储的首地址开始,每一个元素放置到内存中时,它都会认为内存是以它自己的大小来划分的,因此元素放置的位置一定会在自己宽度的整数倍上开始(以结构体变量首地址为0计算)。
1.5.2 原则2
- 在经过第一原则分析后,检查计算出的存储单元是否为所有元素中最宽的元素的长度的整数倍,是,则结束;若不是,则补齐为它的整数倍。
详情可查看 https://blog.csdn.net/liukun321/article/details/6974282 博文。
2.小demo
使用指向结构体的指针找出学生成绩最大最小值,平均值。
#include
#include
struct Student {
int num;
int score;
char *name;
};
void initStudent(struct Student *stu, int len) {
int i;
for (i = 0; i < len; i++) {
printf("Please Input %d Student's num\n", i + 1);
scanf("%d", &(stu->num));
printf("Please Input %d Student's score\n", i + 1);
scanf("%d", &(stu->score));
printf("Please Input %d Student's name\n", i + 1);
stu->name = (char *)malloc(128);
scanf("%s", stu->name);
stu++;
}
}
void printStudent(struct Student *stu, int len) {
int i;
for (i = 0; i < len; i++) {
printf("num: %d,score: %d,name: %s\n", stu->num, stu->score, stu->name);
stu++;
}
}
struct Student *findMax(struct Student *stu, int len) {
int i;
struct Student *max;
max = stu;
for (i = 0; i < len; i++) {
if (max->score < stu->score) {
max = stu;
}
stu++;
}
return max;
}
struct Student *findMin(struct Student *stu, int len) {
int i;
struct Student *min;
min = stu;
for (i = 0; i < len; i++) {
if (min->score > stu->score) {
min = stu;
}
stu++;
}
return min;
}
float findAvg(struct Student *stu, int len) {
int i;
int sum = 0;
for (i = 0; i < len; i++) {
sum += stu->score;
stu++;
}
return (float)sum / len;
}
void printRet(struct Student *max, struct Student *min, float avg) {
printf("max: num: %d ,score : %d ,name : %s\n", max->num, max->score,
max->name);
printf("min: num: %d ,score : %d ,name : %s\n", min->num, min->score,
min->name);
printf("avg: %f \n", avg);
}
int main() {
struct Student stu[3];
int len = sizeof(stu) / sizeof(stu[0]);
struct Student *max;
struct Student *min;
float avg;
initStudent(stu, len);
printStudent(stu, len);
max = findMax(stu, len);
min = findMin(stu, len);
avg = findAvg(stu, len);
printRet(max, min, avg);
return 0;
}
使用指向结构体的指针初始化结构体,增加结构体中的cnt。
#include
#include
#include
struct Houxuan {
char *name;
int cnt;
};
void initHouxuan(struct Houxuan *man, int len) {
int i = 0;
for (i = 0; i < len; i++) {
printf("Please Input %d's name\n", i + 1);
man->name = (char *)malloc(128);
scanf("%s", man->name);
man->cnt = 0;
man++;
}
}
void addCnt(struct Houxuan *man, int len) {
int i = 0;
int j = 0;
char name[128];
for (i = 0; i < 5; i++) {
printf("Please Input %d man's name\n", i + 1);
scanf("%s", name);
for (j = 0; j < len; j++) {
if (!strcmp(name, man->name)) {
man->cnt++;
}
man++;
}
man = man - len;
}
}
void printRet(struct Houxuan *man, int len) {
int i = 0;
printf("Result: \n");
for (i = 0; i < len; i++) {
printf("name: %s,cnt: %d\n", man->name, man->cnt);
man++;
}
}
int main() {
struct Houxuan man[3];
initHouxuan(man, 3);
addCnt(man, 3);
printRet(man, 3);
return 0;
}
使用指向结构体的指针初始化电脑结构体,输入电脑编号,统计次数,并且输出最大次数的电脑编号及次数。
#include
struct Computer{
int num;
int cnt;
};
void Init(struct Computer *p,int len){
int i;
for(i=0;inum = i+1;
p->cnt=0;
p++;
}
}
void Add(struct Computer *p,int len){
int i,j;
int num;
struct Computer *head;
head = p;
for(j=0;j<5;j++){
printf("input computer's num\n");
scanf("%d",&num);
for(i=0;inum){
p->cnt++;
}
p++;
}
p=head;
}
}
struct Computer *findMax(struct Computer *p,int len){
int i;
struct Computer *max = p;
for(i=0;icnt < p->cnt){
max = p;
}
p++;
}
return max;
}
void printRet(struct Computer *p,int len,struct Computer *max){
int i;
for(i=0;i%d\n",p->num,p->cnt);
p++;
}
printf("max computer is %d,cnt is %d\n",max->num,max->cnt);
}
int main(){
struct Computer com[5];
struct Computer *max;
Init(com,5);
Add(com,5);
max = findMax(com,5);
printRet(com,5,max);
return 0;
}