C语言_结构体总结

Posted DS小龙哥

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言_结构体总结相关的知识,希望对你有一定的参考价值。

当前文章介绍动态堆空间内存分配与释放,C语言结构体定义、初始化、赋值、结构体数组、结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用。

1. 动态内存管理

C语言代码----->编译----->链接------>可执行的二进制文件(windows下xxx.exe)
二进制文件中的数据是如何摆放的? 文本数据段、静态数据段、全局数据段。

堆栈空间: 代码在运行的时候才有的空间。
栈空间: 系统负责申请,负责释放。比如: 函数形参变量、数组……
堆空间: 程序员负责申请,负责释放。

#include <stdlib.h>     //标准库头文件
void *malloc(int size); //内存申请。 形参表示申请的空间大小,返回值:申请的空间的地址
void free(void *p);     //内存释放。 形参就是要释放的空间首地址。

动态空间申请示例。

动态空间申请
#include "stdio.h"
#include "string.h"
#include <stdlib.h>
int main()

    int *p=malloc(sizeof(int)); //申请空间
    if(p!=NULL)
    
        printf("申请的空间地址: 0x%X\\n",p);
        *p=888;
        printf("%d\\n",*p);
    
    free(p); //释放空间
    return 0;

示例2:
#include "stdio.h"
#include "string.h"
#include <stdlib.h>

char *func(void)

    char*str=malloc(100); //char str[100];
    if(str!=NULL)
    
        strcpy(str,"1234567890");
        printf("子函数打印:%s\\n",str);
        //free(str); //释放空间
        return str;
    
    else
    
        return NULL;
    


int main()

    char *p=func();
    printf("主函数打印:%s\\n",p);
    return 0;

2. 结构体

2.1 定义语法

结构体的概念: 可存放不同数据类型的集合。
比如: 存放一个班级学生的信息。
可以使用一个结构体存放一个学生的信息。
一个结构体数组存放整个班级的学习信息。
数组的概念: 可存放相同数据类型的集合。

结构体的定义语法:

//声明一种新类型-----数据类型
struct <结构体的名称>

    <结构体的成员>1;
<结构体的成员>2;
…………
;  //最后有分号结束

struct MyStruct 

    char a;
    int b;
    float c;
    char str[100];
;

2.2 定义示例

结构体如何赋值? 如何访问结构体内部成员

#include "stdio.h"
#include "string.h"
#include <stdlib.h>

//定义结构体数据类型
struct MyStruct

    char a;
    int b;
    float c;
    char str[100];
;
int main()

    struct MyStruct data=A,123,456.789,"abcd"; //data就是结构体类型的变量
    //结构体变量访问内部成员的语法:  . 点运算符
    printf("%c\\n",data.a);
    printf("%d\\n",data.b);
    printf("%f\\n",data.c);
    printf("%s\\n",data.str);
    return 0;

2.3 初始化

#include "stdio.h"
#include "string.h"
#include <stdlib.h>

//定义结构体数据类型
struct MyStruct

    char a;
    int b;
    float c;
    char str[100];
data=A,123,456.789,"abcd"; //data就是结构体类型的变量

int main()

    //结构体变量访问内部成员的语法:  . 点运算符
    printf("%c\\n",data.a);
    printf("%d\\n",data.b);
    printf("%f\\n",data.c);
    printf("%s\\n",data.str);
    return 0;

2.4 结构体赋值

  //结构体变量访问内部成员的语法:  . 点运算符
#include "stdio.h"
#include "string.h"
#include <stdlib.h>

//定义结构体数据类型
struct MyStruct

    char a;
    int b;
    float c;
    char str[100];
; 

int main()

    struct MyStruct data;//data就是结构体类型的变量
    //成员单独赋值
    data.a=A;
    data.b=123;
    data.c=456.789;
    strcpy(data.str,"abcd"); //数组赋值

    //结构体变量访问内部成员的语法:  . 点运算符
    printf("%c\\n",data.a);
    printf("%d\\n",data.b);
    printf("%f\\n",data.c);
    printf("%s\\n",data.str);
    return 0;

2.5 结构体数组

结构体赋值分为两种标准:  C89 、C99
结构体数组
#include "stdio.h"
#include "string.h"
#include <stdlib.h>

//定义结构体数据类型
struct MyStruct

    char a;
    int b;
    float c;
    char str[100];
; 

int main()

    struct MyStruct data[100];//data就是结构体数组类型变量
    struct MyStruct data2[50];

    //成员单独赋值
    data[0].a=A;
    data[0].b=123;
    data[0].c=456.789;
    strcpy(data[0].str,"abcd"); //数组赋值

    //结构体变量访问内部成员的语法:  . 点运算符
    printf("%c\\n",data[0].a);
    printf("%d\\n",data[0].b);
    printf("%f\\n",data[0].c);
    printf("%s\\n",data[0].str);
    return 0;

2.6 结构体指针赋值

#include "stdio.h"
#include "string.h"
#include <stdlib.h>
//定义结构体数据类型
struct MyStruct

    char a;
    int b;
    float c;
    char str[100];
; 

int main()

    //struct MyStruct buff[100];
    //struct MyStruct *data=buff; //结构体指针类型变量

    struct MyStruct *data=malloc(sizeof(struct MyStruct));
    data->a=A;
    data->b=123;
    data->c=456.789;
    strcpy(data->str,"abcd");

    //结构体指针访问内部成员的变量 通过  ->  运算符。 
    printf("%c\\n",data->a);
    printf("%d\\n",data->b);
    printf("%f\\n",data->c);
    printf("%s\\n",data->str);
    return 0;

3. 学生管理系统

作业: 学生管理系统

需求: (每一个功能都是使用函数进行封装)
1.实现从键盘上录入学生信息。 (姓名、性别、学号、成绩、电话号码)
2.将结构体里的学生信息全部打印出来。
3.实现根据学生的姓名或者学号查找学生,查找到之后打印出学生的具体信息。
4.根据学生的成绩对学生信息进行排序。
5.根据学号删除学生信息。

示例:

#include "stdio.h"
#include "string.h"
#include <stdlib.h>

//定义存放学生信息的结构体类型
struct StuDentInfo

    char Name[20]; //姓名
    int number;    //学号
    char phone[20];//电话号码
; 

//全局变量区域
unsigned int  StuDentCnt=0; //记录已经录入的全部学生数量

//函数声明区域
void PrintStuDentInfoList(void);
void InputStuDentInfo(struct StuDentInfo*info);
void FindStuDentInfo(struct StuDentInfo*info);
void SortStuDentInfo(struct StuDentInfo*info);
void PrintStuDentInfo(struct StuDentInfo*info);

int main()

    struct StuDentInfo data[100]; //可以100位学生的信息
    int number;
    while(1)
    
        PrintStuDentInfoList(); //打印功能列表
        scanf("%d",&number);
        printf("\\n");
        switch(number)
        
        case 1:
            InputStuDentInfo(data);
            break;
        case 2:
            FindStuDentInfo(data);
            break;
        case 3:
            SortStuDentInfo(data);
            break;
        case 4:
            PrintStuDentInfo(data);
            break;
        case 5:
            break;
        default:
            printf("选择错误!\\n\\n");
            break;
        
    
    return 0;


/*
函数功能: 打印学生管理系统的功能列表
*/
void PrintStuDentInfoList(void)

    printf("\\n--------------学生管理系统功能列表----------------\\n");
    printf("1. 录入学生信息\\n");
    printf("2. 根据学号查找学生信息\\n");
    printf("3. 根据学号排序\\n");
    printf("4. 打印所有学生信息\\n");
    printf("5. 删除指定的学生信息\\n");
    printf("请选择功能序号:");


/*
函数功能: 录入学生信息
*/
void InputStuDentInfo(struct StuDentInfo*info)

    printf("输入学生姓名:");
    scanf("%s",info[StuDentCnt].Name);
    printf("输入学号:");
    scanf("%d",&info[StuDentCnt].number);
    printf("输入电话号码:");
    scanf("%s",info[StuDentCnt].phone);
    StuDentCnt++; //数量自增


/*
函数功能: 查找学生信息
*/
void FindStuDentInfo(struct StuDentInfo*info)

    int num,i;
    printf("输入查找的学号:");
    scanf("%d",&num);
    for(i=0; i<StuDentCnt; i++)
    
        if(info[i].number==num)
        
            printf("信息查找成功,该学生的信息如下:\\n");
            printf("姓名:%s\\n",info[i].Name);
            printf("学号:%d\\n",info[i].number);
            printf("电话号码:%s\\n",info[i].phone);
            printf("\\n");
            break;
        
    
    if(i==StuDentCnt)
    
        printf("----------%d学号不存在!---------\\n",num);
    


/*
函数功能: 根据学号排序
*/
void SortStuDentInfo(struct StuDentInfo*info)

    int i,j;
    struct StuDentInfo tmp; //保存临时信息
    for(i=0; i<StuDentCnt-1; i++)
    
        for(j=0;j<StuDentCnt-i-1;j++)
        
            if(info[j].number>info[j+1].number)
            
                tmp=info[j];
                info[j]=info[j+1];
                info[j+1]=tmp;
            
        
    


/*
函数功能: 打印所有学生信息
*/
void PrintStuDentInfo(struct StuDentInfo*info)

    int i=0;
    printf("-----------所有学生的信息列表------------\\n");
    for(i=0;i<StuDentCnt;i++)
    
        printf("姓名:%s\\n",info[i].Name);
        printf("学号:%d\\n",info[i].number);
        printf("电话号码:%s\\n",info[i].phone);
        printf("\\n");
    

以上是关于C语言_结构体总结的主要内容,如果未能解决你的问题,请参考以下文章

C语言进阶—— 结构体总结(位段 枚举公用体)

C语言关于结构体变量为动态数组赋值问题

ZZNUOJ_用C语言编写程序实现1190:查询记录(结构体专题)(附完整源码)

ZZNUOJ_用C语言编写程序实现1191:添加记录(结构体专题)(附完整源码)

C语言程序设计--班级档案管理系统

ZZNUOJ_用C语言编写程序实现1192:删除记录(结构体专题)(附完整源码)