35深入理解C指针之---结构体基础
一、结构体基础
1、定义:结构体大大加强了C的数据聚合能力,可以使得不同类型的数据进行结合
2、特征:
1)、结构体可以使得不同类型的数据进行结合
2)、结构体可以使用内置的数据类型,包括指针
3)、结构体可以使用自定义的数据类型,甚至自身(必须是命名结构体)
4)、结构体成员的访问通过成员访问符号'.',若是结构体指针时,访问成员变量时可以使用->
5)、结构体的普通定义
6)、结构体的类型定义
7)、结构体指针的定义及应用
8)、结构体的大小
9)、结构体其他
3、基本定义及应用:
#include <stdio.h>
#include <string.h> int main(int argc, char **argv)
{
struct _person{
char firstName[];
char lastName[];
char title[];
int age;
}; struct _person person1;
strcpy(person1.firstName, "guo");
strcpy(person1.lastName, "zhumulama");
strcpy(person1.title, "study hard every day!");
person1.age = ; printf("usual struct define:\n");
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); typedef struct person{
char firstName[];
char lastName[];
char title[];
int age;
} Person; Person person2;
strcpy(person2.firstName, "zhang");
strcpy(person2.lastName, "hangchao");
strcpy(person2.title, "study hard every year!");
person2.age = ; printf("typedef struct define:\n");
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); return ;
}
代码说明:
1)、第6-11行代码是结构体的普通定义
2)、若使用普通定义,声明结构体的方式如13行所示
3)、第22-27行代码是结构体的类型定义
4)、若使用类型定义,声明结构体的方式如29行所示
5)、第20行和36行,演示了结构体成员的访问;
6)、一般情况下,使用结构体的类型定义比较方便;
4、结构体指针及结构体成员指针的应用:
#include <stdio.h>
#include <string.h>
#include <stdlib.h> int main(int argc, char **argv)
{
typedef struct _person{
char *firstName;
char *lastName;
char *title;
int age;
} Person; Person person1;
person1.firstName = (char *)malloc(strlen("zhang") + );
strcpy(person1.firstName, "zhang");
person1.lastName = (char *)malloc(strlen("hangchao") + );
strcpy(person1.lastName, "hangchao");
person1.title= (char *)malloc(strlen("study hard every year!") + );
strcpy(person1.title, "study hard every year!");
person1.age = ; 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);
printf("\n"); Person *ptrPerson = (Person *)malloc(sizeof(Person));
(*ptrPerson).firstName = (char *)malloc(strlen("wangu") + );
strcpy((*ptrPerson).firstName, "wangu");
(*ptrPerson).lastName = (char *)malloc(strlen("chaohang") + );
strcpy((*ptrPerson).lastName, "chaohang");
(*ptrPerson).title= (char *)malloc(strlen("study hard every dayd!") + );
strcpy((*ptrPerson).title, "study hard every dayd!");
(*ptrPerson).age = ; 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);
printf("\n"); Person *ptrPerson1 = (Person *)malloc(sizeof(Person));
ptrPerson1->firstName = (char *)malloc(strlen("wangu") + );
strcpy((*ptrPerson1).firstName, "wangu");
ptrPerson1->lastName = (char *)malloc(strlen("chaohang") + );
strcpy((*ptrPerson1).lastName, "chaohang");
ptrPerson1->title= (char *)malloc(strlen("study hard every dayd!") + );
strcpy((*ptrPerson1).title, "study hard every dayd!");
ptrPerson1->age = ; 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);
printf("\n"); return ;
}
代码说明:
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->是结构体指针访问成员的新式方法,现在用的比较频繁;
35深入理解C指针之---结构体基础的更多相关文章
- C++指针和结构体基础知识
学习C++首先要回忆起C语言当中的指针和结构体知识,本文作者将通过一段代码来总结指针和结构体基础知识:指针是一个变量,其值为另一个变量的地址,即,内存位置的直接地址.就像其他变量或常量一样,您必须在使 ...
- 36深入理解C指针之---结构体的内存处理
一.有关结构体的内存处理包括,结构体指针和结构体成员指针的内存分配.结构体成员的数据对齐.结构体的内存释放 1.定义:与自定义数据类型(结构体)有关的内存分配.大小和释放问题 2.特征: 1).用内存 ...
- 37深入理解C指针之---结构体与指针
一.结构体与指针 1.结构体的高级初始化.结构体的销毁.结构体池的应用 2.特征: 1).为了避免含有指针成员的结构体指针的初始化复杂操作,将所有初始化动作使用函数封装: 2).封装函数主要实现内存的 ...
- 深入理解C指针之六:指针和结构体
原文:深入理解C指针之六:指针和结构体 C的结构体可以用来表示数据结构的元素,比如链表的节点,指针是把这些元素连接到一起的纽带. 结构体增强了数组等集合的实用性,每个结构体可以包含多个字段.如果不用结 ...
- 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实战了 一.多级指针 指针的概念我们在前面 ...
- 【阅读笔记】《C程序员 从校园到职场》第七章 指针和结构体
原文地址:让你提前认识软件开发(13):指针及结构体的使用 CSDN博客 https://blog.csdn.net/zhouzhaoxiong1227/article/details/2387299 ...
- C++ 利用指针和数组以及指针和结构体实现一个函数返回多个值
C++ 利用指针和数组实现一个函数返回多个值demo1 #include <iostream> using namespace std; int* test(int,int,int); i ...
- C语言--- 高级指针2(结构体指针,数组作为函数参数)
一.结构体指针 1. 什么是结构体指针?指向结构体变量的指针 结构体: typedef struct stu{ char name[ ...
随机推荐
- python爬虫: 豆瓣电影top250数据分析
转载博客 https://segmentfault.com/a/1190000005920679 根据自己的环境修改并配置mysql数据库 系统:Mac OS X 10.11 python 2.7 m ...
- ipmitool的使用
https://www.ibm.com/developerworks/cn/linux/l-ipmi/index.html
- [提供可行性脚本] RHEL 7/CentOS 7/Fedora28 重命名网卡名称
实验说明: 在许多自动化任务中,脚本往往是通过读取配置文件来获取信息的,红帽系的系统自升级之后(CentOS7/RHEL7),网卡命名采用“一致性网络设备接口”的命名方法,导致不同设备的不同网卡名称各 ...
- 【转】centos中service命令与/etc/init.d的关系以及centos7的变化
centos中service命令与/etc/init.d的关系 service httpd start 其实是启动了存放在/etc/init.d目录下的脚本. 但是centos7的服务管理改规则了.C ...
- laravel中redis各方法的使用
在laravel中使用redis自带方法的时候会发现许多原生的方法都不存在了,laravel对其进行了重新的封装但是在文档中并没有找到相关的资料最后在 \vendor\predis\predis\sr ...
- 第7课 Thinkphp 5 模板输出变量使用函数 Thinkphp5商城第四季
目录 1. 手册地址: 2. 如果前面输出的变量在后面定义的函数的第一个参数,则可以直接使用 3. 还可以支持多个函数过滤,多个函数之间用"|"分割即可,例如: 4. 变量输出使用 ...
- golang http 中间件
golang http 中间件 源码链接 golang的http中间件的实现 首先实现一个http的handler接口 type Handler interface { ServeHTTP(Respo ...
- python3 连接 mysql和mariadb的模块
是pymysql python2中是MySQL-python sudo pip install pymysql 参考博客https://www.jb51.net/article/140387.htm
- HDU 5396 区间DP 数学 Expression
题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...
- luogu3690 【模板】Link Cut Tree (动态树)
参考there和there 题单 #include <iostream> #include <cstdio> using namespace std; int n, m, va ...