结构体和共用体

编程入门 行业动态 更新时间:2024-10-07 23:20:31

<a href=https://www.elefans.com/category/jswz/34/1771419.html style=结构体和共用体"/>

结构体和共用体

 结构体和共用体

注:本文为学习《C语言从入门到精通》时,对部分章节的总结

1、结构体

1.1、结构体类型的概念

结构体是一种构造类型,由若干成员组成。成员可以是一个基本数据累心,也可以是一个构造类型。

struct 结构体名 {

    成员列表

};

关键字struct表示声明结构,其后的结构已经表示该结构的类型名。

1.2、结构体变量的定义

a、先声明结构体类型,在定义变量

struct Student {char name[20];unsigned int age;
}; // 声明结构体
struct Student student1; // 定义一个结构体

构造类型      变量名、

b、在声明结构类型时,同时定义变量

struct结构体名 {成员列表
}变量名列表;struct Student {char name[20];unsigned int age;
} student1, student2;

c、直接定义结构体类型变量   

struct {成员列表
} 变量名列表;struct {char name[20];unsigned int age;
} student1, student2;

1.3、结构体变量的引用

结构变量名.成员名

比如:

student1.name = “zhangsan”;
student2.age  = 18;

1.4、结构体类型的初始化

struct Student {char name[20];unsigned int age;
}student1 = {“zhangsan”, 18};
struct Student student2 = {“wangwu”, 22};

2、结构体数组

2.1、定义结构体数组

struct 结构体名 {成员列表;
} 数组名;

2.2、初始化结构体数组

struct 结构体名 {成员列表;
} 数组名 = {初始化列表};

3、结构体指针

3.1、指向结构体变量的指针

结构体类型 *指针名;

例如:

struct Student *pStudent;

使用方式有两种:a、(*pStudent).成员名

                     b、PStudent->成员名

3.2、指向结构体数组的指针

 

3.3、结构体作为函数参数

 

4、包含结构的结构

 

5、链表

5.1、链表概述

 

5.2、创建动态链表

a、malloc函数

    void *malloc(unsigned int size);

   功能:在内存中动态地分配一块size大小的内存空间,返回一个指向分配的内存的指针,分配控件错误时,返回NULL

b、calloc函数

    void *calloc(unsigned int n, unsigned int size);

    功能:在内存中动态地分配n个长度为size的连续内存空间数组,返回一个指向分配的连续内存的指针,分配控件错误时,返回NULL

c、free函数

    void free(void *ptr);

    功能:使用由指针ptr指向的内存区,是部分内存区能被其它变量使用。

typedef struct Student {char name[20];        //姓名unsigned int num;     //学号struct Student* next; //指向下一个节点
} Student;unsigned int count; //链表长度//创建链表
Student* CreateList()
{Student* head = NULL; //初始化链表头Student* newList = NULL;Student* endList= (Student*)malloc(sizeof(Student));if (endList == NULL) {return NULL;}newList = endList;count = 0; //初始化链表长度if (scanf("%s %u", newList->name, &newList->num) == EOF) {return NULL;}while (newList->num != 0) {count++;if (count != 1) {newList->next = NULL;endList->next = newList;endList = newList;} else {newList->next = NULL;head = newList;}newList = (Student*)malloc(sizeof(Student));if (newList == NULL) {return head;}if (scanf("%s %u", newList->name, &newList->num) == EOF) {return head;}}free(newList);newList = NULL;return head;
}

5.3、输出链表

//遍历链表
//head:头指针
void PrintList(Student* head)
{Student* tmp = head;unsigned int index = 1;while (tmp != NULL) {printf("[member %u] [name %s] [num %u]\n", index, tmp->name, tmp->num);tmp = tmp->next;index++;}
}

6、链表相关操作

6.1、链表的插入操作

链表的插入操作可以再链表的头结点、中间、和尾结点后

//链表头插法
//head:头指针
unsigned int Insert(Student* head)
{Student* newNode = (Student*)malloc(sizeof(Student*));if (newNode == NULL) {return 1; //插入失败}if (scanf("%s %u", newNode->name, &newNode->num) == EOF) {return 1;}newNode->next = head;head->next = newNode;count++;return 0;
}

 

6.2、链表的删除操作

//删除某个节点
//head:头指针
//index:需要删除的节点下标
unsigned int Delete(Student* head, unsigned int index)
{Student* pre = head; //需要删除的节点的前一个节点if (index > count || index == 0) {return 1;}while (index--) {pre = pre->next;}Student* tmp = pre->next;pre->next = tmp->next;free(tmp);tmp = NULL;count--;return 0;
}//清空链表
//head:头指针
void ClearList(Student* head)
{Student* tmp = head;Student* p = tmp->next;while (p) {free(tmp);tmp = p;p = tmp->next;}
}

7、共用体

共用体和结构体类似,关键字换成了union。

区别:结构体:定义了一个有多个数据成员组成的特殊类型

          共用体:定义了一块为所有数据成员共享的内存

7.1、共同体的概念

共用体也称联合体,使所用成员变量存放在同一段内存中,所以共用体在同一时刻只能有一个值,它属于某一个数据成员。共同体的大小等于最大的成员大小

union 共用体名 {

    成员列表

} 变量列表;

7.2、共用体变量的引用

共用体变量.成员名;

7.3、共用体变量的初始化

定义共用体变量时,可以同时进行初始化。初始化时,只需要一个初始化值就可以,其类型必须和共用体第一个成员类型一致;如果第一个成员类型为结构体,则初始化值为一组值。

8、枚举类型

利用关键字enum声明枚举类型,可以定义枚举类型变量,一个枚举变量包含一组相关的标识符(必须是唯一的),每个标识符对应一个整数值,称为枚举常量。

enum Colors {Red, Green, Blue};

Colors为枚举变量,括号中的第一个标识符(Red)对应数值0,第二个(Green)对应1,以此类推。

更多推荐

结构体和共用体

本文发布于:2024-02-25 08:07:40,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1698323.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:结构

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!