Skip to content

结构体

1.结构体

1.1 定义与声明

结构体:由不同数据类型组成的有机整体
先声明,再定义

plain
struct 结构体名
{
    成员列表;
};
plain
struct Product
{
    char Name[10];    //产品名称
    char Shape[20];   //产品形状
    char Color[10];   //产品颜色
    char Func[20];    //产品功能
    int price;        //产品价格
    char Area[20];    //产品产地
};

声明的同时定义

plain
struct 结构体名
{
    成员列表;
}变量名列表;
plain
struct Product
{
    char Name[10];    //产品名称
    char Shape[20];   //产品形状
    char Color[10];   //产品颜色
    char Func[20];    //产品功能
    int price;        //产品价格
    char Area[20];    //产品产地
}product1,product2;

直接定义

plain
struct
{
    成员列表;
}变量名列表;
plain
struct
{
    char Name[10];    //产品名称
    char Shape[20];   //产品形状
    char Color[10];   //产品颜色
    char Func[20];    //产品功能
    int price;        //产品价格
    char Area[20];    //产品产地
}product1,product2;

不要忘记结构体后的分号
通常将结构体的声明放在头文件中

1.2 引用

结构体变量.成员名

plain
product1.Name="Icebox";
product2.Price="2000";

只能对最低级的结构体成员进行操作,不能直接操作结构体
既能引用结构体成员地址,也能直接引用结构体变量地址

plain
#include<stdio.h>
struct Product
{
    char Name[10];    //产品名称
    char Shape[20];   //产品形状
    char Color[10];   //产品颜色
    char Func[20];    //产品功能
    int Price;        //产品价格
    char Area[20];    //产品产地
};
int main()
{
    struct Product product1;
    printf("请输入产品名称:");
    scanf("%s",&product1.Name);
    printf("请输入产品形状:");
    scanf("%s",&product1.Shape);
    printf("请输入产品颜色:");
    scanf("%s",&product1.Color);
    printf("请输入产品功能:");
    scanf("%s",&product1.Func);
    printf("请输入产品价格:");
    scanf("%d",&product1.Price);
    printf("请输入产品产地:");
    scanf("%s",&product1.Area);
    printf("产品名称:%s\n",product1.Name);
    printf("产品形状:%s\n",product1.Shape);
    printf("产品颜色:%s\n",product1.Color);
    printf("产品功能:%s\n",product1.Func);
    printf("产品价格:%d\n",product1.Price);
    printf("产品产地:%s\n",product1.Area);
    return 0;
}

1.3 初始化

plain
#include<stdio.h>
struct Student
{
    char Name[10];
    char Sex;
    int Grade;
} student1={"zhangsan",'M',100};
int main()
{
    struct Student student2={"lisi",'W',99};
    printf("结构体1中的信息为:\n");
    printf("姓名:%s\n性别:%c\n成绩:%d\n",student1.Name,student1.Sex,student1.Grade);
    printf("结构体2中的信息为:\n");
    printf("姓名:%s\n性别:%c\n成绩:%d\n",student2.Name,student2.Sex,student2.Grade);	
    return 0;
}

2.结构体数组

2.1 定义

plain
struct 结构体名
{
    成员列表;
}数组名;
plain
struct Student
{
    char Name[10];
    int Number;
    char Sex;
    int Grade;
}student[5];

2.2 初始化

plain
struct 结构体名
{
    成员列表;
}数组名={初始值列表};
plain
#include<stdio.h>
struct Student
{
    char Name[10];
    int Number;
    char Sex;
    int Grade;
}student[5]={{"zhangsan",000001,'M',90},
            {"lisi",000002,'W',100},
            {"wangwu",000003,'M',80},
            {"zhaoliu",000004,'w',70},
            {"zhongqi",000005,'M',60}};
int main()
{
    int i;
    for(i=0;i<5;i++)
    {
        printf("第%d名学生:\n",i+1);
        printf("姓名:%s\n学号:%d\n性别:%c\n成绩:%d\n",student[i].Name,student[i].Number,student[i].Sex,student[i].Grade);
        printf("\n"); 
    }
}

3.结构体指针

3.1 指向结构体变量

定义

结构体类型 \*指针名

引用

  • 使用点运算符引用结构成员
    (*pStruct).成员名
  • 使用指向运算符引用结构成员
    pStruct->成员名
plain
#include<stdio.h>
#include<string.h>
struct Student
{
    char Name[10];
    int Number;
    char Sex;
    int Grade;
}student;
int main()
{
    struct Student *pStruct;
    pStruct=&student;
    strcpy(pStruct->Name,"zhangsan");
    pStruct->Number=000001;
    pStruct->Sex='W';
    pStruct->Grade=100;
    printf("姓名:%s\n学号:%d\n性别:%c\n成绩:%d\n",student.Name,student.Number,student.Sex,student.Grade);
}

3.2 指向结构体数组

plain
#include<stdio.h>
struct Student
{
    char Name[10];
    int Number;
    char Sex;
    int Grade;
}student[5]={{"zhangsan",000001,'M',90},
            {"lisi",000002,'W',100},
            {"wangwu",000003,'M',80},
            {"zhaoliu",000004,'w',70},
            {"zhongqi",000005,'M',60}};
int main()
{
    struct Student*pStruct;
    int i;
    pStruct=student;
    for(i=0;i<5;i++,pStruct++)
    {
        printf("第%d名学生:\n",i+1);
        printf("姓名:%s\n学号:%d\n性别:%c\n成绩:%d\n",pStruct->Name,pStruct->Number,pStruct->Sex,pStruct->Grade);
        printf("\n");
    }
    return 0;
}

3.3 结构体作函数参数

结构体变量

plain
#include<stdio.h>
struct Student
{
    char Name[10];
    float Score[3];
}student0={"Zhangsan",80,85,87.5};
void Display(struct Student student)
{
    printf("姓名:%s\n语文:%.1f\n数学:%.1f\n英语:%.1f\n",student.Name,student.Score[0],student.Score[1],student.Score[2]);
    printf("平均分:%.1f",(student.Score[0]+student.Score[1]+student.Score[2])/3);
}
int main()
{
    Display(student0);
    return 0;
}

指向结构体变量指针

plain
#include<stdio.h>
struct Student
{
    char Name[10];
    float Score[3];
}student={"Zhangsan",80,85,87.5};
void Display(struct Student *stu)
{
    printf("姓名:%s\n语文:%.1f\n数学:%.1f\n英语:%.1f\n",stu->Name,stu->Score[0],stu->Score[1],stu->Score[2]);
    stu->Score[2]=80; 
}
int main()
{
    struct Student *pStruct=&student;
    Display(pStruct);
    printf("改变后的英语:%.1f",pStruct->Score[2]);
    return 0;
 }

结构体变量成员

4.包含结构的结构

plain
#include<stdio.h>
struct data
{
    int year;
    int month;
    int day;
};
struct student
{
    char Name[10];
    int num;
    char sex;
    struct data birthday;
}student={"Zhangsan",000001,'M',{1999,12,21}};
int main()
{
    printf("姓名:%s\n学号:%d\n性别:%c\n生日:%d/%d/%d",student.Name,student.num,student.sex,student.birthday.year,student.birthday.month,student.birthday.day);
    return 0;
}

5.链表

5.1 概述

链表必须利用指针实现

5.2 动态链表

malloc函数:在内存中动态的分配一块内存空间
void *malloc(int size);
calloc函数:在内存中动态分配n个连续内存空间
void calloc(unsigned n,unsigned size);
free函数:使用指针指向的内存区
void free(void *p);

补充

一个程序可以由一个或多个源文件组成,但只能有一个源函数

c语言编译不检查注释

c语言的基本组成单位是函数

c语言总是先从main()函数开始执行

形式参数是局部变量

机器语言的所有指令和数据都是一串二进制数0和1表示


输出a:printf("%d",a);

输入:getchar()

输入(无enter带回显):getche()

输入(无enter无回显):getch()

输入a:scanf("%d",&a);

输入一行:gets()

输出换行:puts()

控制台暂停:system("pause");

控制台颜色:system("color XY");

绿底白字:system("color 2F");

白底红字:system("color F4");
  • 0 = 黑色
  • 1 = 蓝色
  • 2 = 绿色
  • 3 = 浅绿色
  • 4 = 红色
  • 5 = 紫色
  • 6 = 黄色
  • 7 = 白色
  • 8 = 灰色
  • 9 = 淡蓝色
  • A = 淡绿色
  • B = 淡浅绿色
  • C = 淡红色
  • D = 淡紫色
  • E = 淡黄色
  • F = 亮白色

睡眠1秒:sleep(1000);

清除屏幕内容:system("cls");

随机数:rand()

初始化随机数种子:srand()

每次都随机:srand((unsigned)time(NULL))

关机:system("shutdown -s -t 50");

重启:system("shutdown -r -t 50");

取消关机:system("shutdown -a");

获取长度:include<string.h> strlen()

字典顺序:include<string.h> strcmp()

复制:include<string.h> strcpy()