37深入理解C指针之---结构体与指针
一、结构体与指针
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指针之---结构体与指针的更多相关文章
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
- 35深入理解C指针之---结构体基础
一.结构体基础 1.定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合 2.特征: 1).结构体可以使得不同类型的数据进行结合 2).结构体可以使用内置的数据类型,包括指针 3). ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 深入了解Windows句柄到底是什么(句柄是逻辑指针,或者是指向结构体的指针,图文并茂,非常清楚)good
总是有新入门的Windows程序员问我Windows的句柄到底是什么,我说你把它看做一种类似指针的标识就行了,但是显然这一答案不能让他们满意,然后我说去问问度娘吧,他们说不行网上的说法太多还难以理解. ...
- 【学习笔记】【C语言】指向结构体的指针
1.指向结构体的指针的定义 struct Student *p; 2.利用指针访问结构体的成员 1> (*p).成员名称 2> p->成员名称 3.代码 #include < ...
- c语言中较常见的由内存分配引起的错误_内存越界_内存未初始化_内存太小_结构体隐含指针
1.指针没有指向一块合法的内存 定义了指针变量,但是没有为指针分配内存,即指针没有指向一块合法的内浅显的例子就不举了,这里举几个比较隐蔽的例子. 1.1结构体成员指针未初始化 struct stude ...
- C语言中 指针与结构体
就像数组一样,指向结构体的指针存储了结构体第一个元素的内存地址.与数组指针一样,结构体的指针必须声明和结构体类型保持一致,或者声明为void类型. 1 2 3 4 5 6 7 8 9 10 11 12 ...
- c语言指针与结构体
#include <stdio.h> #include <stdlib.h> struct mydata { int num; ]; }; void main1() { /*i ...
- Android For JNI(五)——C语言多级指针,结构体,联合体,枚举,自定义类型
Android For JNI(五)--C语言多级指针,结构体,联合体,枚举,自定义类型 我们的C已经渐渐的步入正轨了,基础过去之后,就是我们的NDK和JNI实战了 一.多级指针 指针的概念我们在前面 ...
随机推荐
- stringByAppendingString和stringByAppendingPathComponent
NSString提供了两个拼串的方法: /** * @brief 简单的字符串拼接,头文件 NSString (NSStringExtensionMethods) * * @param aString ...
- PHP 存储密码
最佳实践是 $hashedPassword = password_hash('my super cool password', PASSWORD_DEFAULT); $res = password_v ...
- HTTP-常用配置
前言 这篇主要介绍HTTP服务程序环境 可能有一些介绍不到,博主能力有限,欢迎大神来纠正改进 HTTP协议从http/0.9到如今的http/2.0中间发生了很大的改变,现在主流的事http/1.1 ...
- Linux常用文档操作命令--2
4.文档压缩与解压操作 在Linux中常见的压缩文件有:*.tar.gz.*.tgz.*.gz.*.Z.*bz2等.其每种不同的压缩文件对印的压缩和解压命令也不同. *.tar.gz :tar程序打包 ...
- 01Qt中的隐式共享
隐式共享 隐式共享又称为回写复制(copy on write).当两个对象共享同一分数据时(通过浅拷贝实现数据共享),如果数据不改变,则不进行数据的复制.而当某个对象需要需要改变数据时,则进行深拷 ...
- 数据库储存session信息代码
今天给大家上一段代码,数据库存储session信息,你只需要将下面这段代码放到session文件中,然后再session_start()的地方引入sessiong文件就行啦,当然你就不用再写sessi ...
- Python头脑风暴3
驾校是个暴利行业 如果有高学历靠谱的IT人员做驾校教练等等等等.... Python虽然难做企业级应用,但Python是全球个人自定义应用的首选!!!没有之一,所有语言最快的开发速度,最个性化的私人定 ...
- Python中的属性访问与描述符
Python中的属性访问与描述符 请给作者点赞--> 原文链接 在Python中,对于一个对象的属性访问,我们一般采用的是点(.)属性运算符进行操作.例如,有一个类实例对象foo,它有一个nam ...
- java_时间戳与Date_相互转化
[转自:http://blog.csdn.net/heng615975867/article/details/36016617] 1.时间戳的定义 时间戳是指文件属性里的创建.修改.访问时间. 数字时 ...
- C++智能指针实现
#include <iostream> #include <string> #define unsigned int size_t using namespace std; / ...