一、结构体与指针

    1、结构体的高级初始化、结构体的销毁、结构体池的应用

    2、特征:

      1)、为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装;

      2)、封装函数主要实现内存的分配和成员的初始化;

      3)、为了避免含有指针成员的结构体指针的释放内存复杂操作,将所有初始化动作使用函数封装;

      4)、封装函数主要实现分配内存的释放;

      5)、避免频繁的malloc和free的任务开销,一般使用结构体池技术;

    3、结构体的高级初始化应用:

  #include <stdio.h>
#include <stdlib.h>
#include <string.h> typedef struct _student{
char *name;
char *address;
int age;
short id;
char sex;
} Student; void initializeStudent(Student *student, const char *nameg, const char *addressg, const int ageg, const short idg, const char sexg){
student->name = (char *)malloc(strlen(nameg) + );
strcpy(student->name, nameg);
student->address = (char *)malloc(strlen(addressg) + );
strcpy(student->address, addressg);
student->age = ageg;
student->id = idg;
student->sex = sexg; return;
} void displayStudent(Student *student){
printf("student %s info:\n", student->name);
printf("student.name: %s\n", student->name);
printf("student.address: %s\n", student->address);
printf("student.age: %d\n", student->age);
printf("student.id: %d\n", student->id);
printf("student.sex: %c\n", student->sex);
printf("\n"); return;
} void deallocateStudent(Student *student){
free(student->name);
free(student->address); return;
} int main(int argc, char **argv)
{
Student student;
initializeStudent(&student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(&student);
deallocateStudent(&student); return ;
}

    代码说明:

      1)、第5-11行是结构体定义

      2)、函数initializeStudent()主要完成结构体的初始化,使用时只要根据参数的类别和顺序传入合适的参数即可;

      3)、函数deallocateStudent()主要完成结构体的销毁工作,使用时传入结构体变量即可;

      4)、函数displayStudent()主要是实现结构体内容的格式化输出;

      5)、函数main完成对以上3个函数的调用及测试,其中第46行是对结构体变量的声明;

      6)、测试函数中,若声明的是结构体指针变量时,将测试部分换成如下代码段即可;

 int main(int argc, char **argv)
{
Student *student = (Student *)malloc(sizeof(Student));
initializeStudent(student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(student);
deallocateStudent(student); return ;
}

    
    4、结构体的销毁应用:

      1)、函数deallocateStudent()的具体实现;

      2)、释放内存的顺序与分配的顺序完全相反即可;

    5、结构体池技术的应用:

  #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LIST_SIZE 10 typedef struct _student{
char *name;
char *address;
int age;
short id;
char sex;
} Student; void initializeStudent(Student *student, const char *nameg, const char *addressg, const int ageg, const short idg, const char sexg){
student->name = (char *)malloc(strlen(nameg) + );
strcpy(student->name, nameg);
student->address = (char *)malloc(strlen(addressg) + );
strcpy(student->address, addressg);
student->age = ageg;
student->id = idg;
student->sex = sexg; return;
} void displayStudent(Student *student){
printf("student %s info:\n", student->name);
printf("student.name: %s\n", student->name);
printf("student.address: %s\n", student->address);
printf("student.age: %d\n", student->age);
printf("student.id: %d\n", student->id);
printf("student.sex: %c\n", student->sex);
printf("\n"); return;
} void deallocateStudent(Student *student){
free(student->name);
free(student->address); return;
} Student *listStu[LIST_SIZE]; void initializeListStu(){
for(int i = ; i < LIST_SIZE; i++){
listStu[i] = NULL;
}
} Student *getStudent(){
for(int i = ; i < LIST_SIZE; i++){
if(listStu[i] != NULL){
Student *stu = listStu[i];
listStu[i] = NULL; return stu;
}
}
Student *student = (Student *)malloc(sizeof(Student)); return student;
} Student *returnStudent(Student *student){
for(int i = ; i < LIST_SIZE; i++){
if(listStu[i] == NULL){
listStu[i] = student; return student;
}
}
deallocateStudent(student);
free(student); return NULL;
} int main(int argc, char **argv)
{
initializeListStu();
Student *student;
student = getStudent(); initializeStudent(student, "zhangsan", "jiangxijiujiang", , , 'M');
displayStudent(student);
returnStudent(student); return ;
}

    代码说明:

      1)、第45行声明结构体Student指针数组,数组大小使用宏定义;

      2)、函数initializeListStu()完成数组的初始化;

      3)、函数getStudent()完成从数组中取得结构体指针,若数组中所有指针都为NULL,临时分配空间,并返回指针;

      4)、函数returnStudent()完成将不需要的结构体指针存回到结构体指针数组中,若数组已满,将指针释放;

      5)、第83行代码完成结构体指针数组的初始化;

      6)、第84行代码声明结构体指针;

      7)、第85行代码完成从结构体指针数组中获取结构体指针;

      8)、第87行代码完成结构体指针的初始化;

      9)、第88行代码完成结构体指针内容的打印输出;

      10)、第89行代码完成结构体指针的返还,如果结构体指针数组已满,自动释放内存,否则,存回结构体指针数组中;

37深入理解C指针之---结构体与指针的更多相关文章

  1. 36深入理解C指针之---结构体的内存处理

    一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...

  2. 35深入理解C指针之---结构体基础

    一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...

  3. 深入理解C指针之六:指针和结构体

    原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...

  4. 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good

    总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...

  5. 【学习笔记】【C语言】指向结构体的指针

    1.指向结构体的指针的定义 struct Student *p;  2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...

  6. c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针

    1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...

  7. C语言中 指针与结构体

    就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...

  8. c语言指针与结构体

    #include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...

  9. Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型

    Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...

随机推荐

  1. C#与SQLServer数据库连接

    第一种连接数据库方法:直接通过数据库的用户名.密码等连接 步骤: (1)建立SqlConnection对象,指定SqlConnection对象的ConnectionString属性: (2)打开数据库 ...

  2. 原型与原型继承demo

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. NOIP模拟赛 数列

    Problem 2 数列(seq.cpp/c/pas) [题目描述] a[1]=a[2]=a[3]=1 a[x]=a[x-3]+a[x-1]  (x>3) 求a数列的第n项对1000000007 ...

  4. [BZOJ] 1127: [POI2008]KUP

    似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...

  5. Linux 安装Nginx+PHP+MySQL教程

    一.安装nginx 通过yum安装openssl: yum -y install openssl openssl-devel 通过yum安装pcre: yum -y install pcre-deve ...

  6. 启动Chrome浏览器弹出“You are using an unsupported command-line flag –ignore-certificate-errors. Stability and security will suffer”

    采用如下代码: public static void launchChrome() { System.setProperty("webdriver.chrome.driver", ...

  7. CodeForces 567F DP Mausoleum

    本着只贴代码不写分析的题解是在耍流氓的原则,还是决定写点分析. 思路很清晰,参考的官方题解,一下文字仅对题解做一个简要翻译. 题意: 有1~n这n个数,每个数用两次.构成一个长为2n的序列,而且要求序 ...

  8. 基于AOP的优惠券发送异常哨兵监控

    本文来自网易云社区 作者:王贝 最近总是发现支付发红包优惠券发完的情况,但是发现的比较迟缓,于是乎,想加一个哨兵监控,统计了一下,组内不少需求都有发送优惠券的行为,也是经常遇到发送异常的情况,所以,想 ...

  9. 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)

    使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...

  10. 《Nginx高性能Web服务器详解》

    第1章 Nginx初探 第2章 Nginx服务器的安装部署 第3章 Nginx服务器架构初探 第4章 Nginx服务器的高级设置 第5章 Nginx服务器的Gzip压缩 第6章 Nginx服务器的Re ...