35深入理解C指针之---结构体基础
一、结构体基础
1、定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合
2、特征:
1)、结构体可以使得不同类型的数据进行结合
2)、结构体可以使用内置的数据类型,包括指针
3)、结构体可以使用自定义的数据类型,甚至自身(必须是命名结构体)
4)、结构体成员的访问通过成员访问符号'.',若是结构体指针时,访问成员变量时可以使用->
5)、结构体的普通定义
6)、结构体的类型定义
7)、结构体指针的定义及应用
8)、结构体的大小
9)、结构体其他
3、基本定义及应用:
1 #include <stdio.h> 2 #include <string.h> 3 4 int main(int argc, char **argv) 5 { 6 struct _person{ 7 char firstName[10]; 8 char lastName[30]; 9 char title[100]; 10 int age; 11 }; 12 13 struct _person person1; 14 strcpy(person1.firstName, "guo"); 15 strcpy(person1.lastName, "zhumulama"); 16 strcpy(person1.title, "study hard every day!"); 17 person1.age = 39; 18 19 printf("usual struct define:\n"); 20 printf("The person1 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person1.firstName, person1.lastName, person1.title, p erson1.age); 21 22 typedef struct person{ 23 char firstName[10]; 24 char lastName[30]; 25 char title[100]; 26 int age; 27 } Person; 28 29 Person person2; 30 strcpy(person2.firstName, "zhang"); 31 strcpy(person2.lastName, "hangchao"); 32 strcpy(person2.title, "study hard every year!"); 33 person2.age = 42; 34 35 printf("typedef struct define:\n"); 36 printf("The person2 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person2.firstName, person2.lastName, person2.title, p erson2.age); 37 38 return 0; 39 }
代码说明:
1)、第6-11行代码是结构体的普通定义
2)、若使用普通定义,声明结构体的方式如13行所示
3)、第22-27行代码是结构体的类型定义
4)、若使用类型定义,声明结构体的方式如29行所示
5)、第20行和36行,演示了结构体成员的访问;
6)、一般情况下,使用结构体的类型定义比较方便;
4、结构体指针及结构体成员指针的应用:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 5 int main(int argc, char **argv) 6 { 7 typedef struct _person{ 8 char *firstName; 9 char *lastName; 10 char *title; 11 int age; 12 } Person; 13 14 Person person1; 15 person1.firstName = (char *)malloc(strlen("zhang") + 1); 16 strcpy(person1.firstName, "zhang"); 17 person1.lastName = (char *)malloc(strlen("hangchao") + 1); 18 strcpy(person1.lastName, "hangchao"); 19 person1.title= (char *)malloc(strlen("study hard every year!") + 1); 20 strcpy(person1.title, "study hard every year!"); 21 person1.age = 42; 22 23 printf("The person1 info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", person1.firstName, person1.lastName, person1.title, person1.age); 24 printf("\n"); 25 26 Person *ptrPerson = (Person *)malloc(sizeof(Person)); 27 (*ptrPerson).firstName = (char *)malloc(strlen("wangu") + 1); 28 strcpy((*ptrPerson).firstName, "wangu"); 29 (*ptrPerson).lastName = (char *)malloc(strlen("chaohang") + 1); 30 strcpy((*ptrPerson).lastName, "chaohang"); 31 (*ptrPerson).title= (char *)malloc(strlen("study hard every dayd!") + 1); 32 strcpy((*ptrPerson).title, "study hard every dayd!"); 33 (*ptrPerson).age = 42; 34 35 printf("The (*ptrPerson). info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", (*ptrPerson).firstName, (*ptrPerson).lastName, (*ptrPerson).title, (*ptrPerson).age); 36 printf("\n"); 37 38 Person *ptrPerson1 = (Person *)malloc(sizeof(Person)); 39 ptrPerson1->firstName = (char *)malloc(strlen("wangu") + 1); 40 strcpy((*ptrPerson1).firstName, "wangu"); 41 ptrPerson1->lastName = (char *)malloc(strlen("chaohang") + 1); 42 strcpy((*ptrPerson1).lastName, "chaohang"); 43 ptrPerson1->title= (char *)malloc(strlen("study hard every dayd!") + 1); 44 strcpy((*ptrPerson1).title, "study hard every dayd!"); 45 ptrPerson1->age = 42; 46 47 printf("The ptrPerson1-> info:\n firstName: %s\n lastName: %s\n title: %s\n and age: %d\n", ptrPerson1->firstName, ptrPerson1->lastName, ptrPerson1->title, ptrPerson1->age); 48 printf("\n"); 49 50 return 0; 51 }
代码说明:
1)、第7-12行代码是结构体的类型定义,结构体成员为指针变量
2)、第14行声明结构体变量
3)、第15,17,19行代码是结构体变量成员分配内存
4)、第16,18,20行代码是结构体变量成员赋值内容
5)、第23行,演示了结构体成员的访问;
6)、第26行和38行声明结构体指针变量;
7)、第26行和38行为结构体指针变量申请内存;
8)、第35行代码是结构体指针变量访问方式,使用(* structName).是结构体指针访问成员的老式方法,现在基本不用;
9)、第47行代码是结构体指针变量访问方式,使用structName->是结构体指针访问成员的新式方法,现在用的比较频繁;
相关文章
- 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制
- koa 基础(十五)cookie 设置中文
- 计算机视觉+人工智能面试笔试总结——深度学习基础题1~20
- mybatis简单基础配置
- 《深入解析Android 虚拟机》——第2章 Java虚拟机基础 2.1虚拟机的作用
- 深入理解Linux网络技术内幕(一)——基础介绍
- Flet教程之 12 Stack 重叠组建图文混合 基础入门(教程含源码)
- 《深入解析sas:数据处理、分析优化与商业应用》一第1章 Base SAS基础
- Java基础篇:对象拷贝:clone方法 以及 序列化
- 机器学习基础-机器学习练习 7- K-means 和PCA(主成分分析)
- Andrew Ng-机器学习基础笔记-SVM
- 如何夯实(Java)编程基础,并深入学习和提高
- 【Verilog基础】2选1MUX实现基础逻辑功能(包括:反相器/与门/或门/与非门/或非门/异或门/同或门)(常考面试题:最少MUX实现异或门/同或门)
- 【FPGA基础】基于 Vivado 2017.4 的FPGA开发流程
- 【HCNA/HCIA】VRP基础指令
- 智慧社区基础是智能家居 终极目的是打造智慧城市
- (3.15)mysql基础深入——mysql默认数据库/系统数据库
- (3.13)mysql基础深入——mysql慢查询日志分析工具之mysqldumpslow
- (3.7)mysql基础深入——mysqld 启动与初始化源码解析【待写】
- (3.8)mysql基础深入——mysql 关机过程详情【待写】
- (3.6)mysql基础深入——mysqld_safe源码简介【待写】
- (3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析
- (3.1)mysql基础深入——mysql二进制与源码目录结构介绍
- 深入 .NET Core 基础 - 2:共享框架
- 23深入理解C指针之---数组的基础
- 【C++ 程序设计入门基础】- 第2节-分支结构