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[ ...
随机推荐
- 代码块(block)的使用
Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...
- [提供可行性脚本] RHEL/CentOS 7 多节点SSH免密登陆
实验说明: 在自动化部署时,会经常SSH别的机器去操作,然而每次的密码认证却很令人烦躁,尤其是很长的密码,因此SSH免密登陆就显得必不可少: 在机器数目很多的时候,使用更过的往往是Ansible分发并 ...
- 在物理机上,用U盘安装esxi虚拟化环境
一般使用U盘安装centos镜像,可使用镜像刻录工具UltraISO,详细方法参照如下链接: https://jingyan.baidu.com/article/647f0115ee55ba7f214 ...
- wdcp 使用说明总结(持续更新中。。。)
wdcp 使用说明总结(持续更新中...) 1.移动文件时,如果是上一层,直接填写../即可
- Python入门基本语法
Python入门 以下主要讲述Python的一些基础语法,包含行的缩进在python中的重要意义,python中常见的保留字和引号的使用,如何实现单行注释和多行注释. print("he ...
- Java策略模式(Strategy)
一.定义 定义一组算法,将每个算法都封装起来,并且使它们之间可以互换.策略模式使这些算法在客户端调用它们的时候能够互不影响地变化.(Java的TreeSet集合中,构造方法可传入具体的比较器对象以实现 ...
- win7下设置git客户端
msysgit官网: http://msysgit.github.io/ 下载msysgit http://msysgit.googlecode.com/files/Git-1.8.5.2-previ ...
- Android后台的linux一直保持唤醒状态,不进入睡眠
由于要做Android手机的电池续航测试,是不能插usb的,所以把case放到sh文件中,之后push到手机里,执行的. 但是出现个问题,假如case中有很长时间的sleep操作,关闭手机屏幕,这样l ...
- Android兼容性测试CTS --环境搭建、测试执行、结果分析
为了确保Android应用能够在所有兼容Android的设备上正确运行,并且保持相似的用户体验,在每个版本发布之时,Android提供了一套兼容性测试用例集合(Compatibility Test S ...
- kettle-批量同步表数据
一.实验目标 利用kettle实现从mysql数据库中的dbf库批量同步表到dbm库(全量同步) 二.实验环境 dbf 库中表f1.f2.f3 .f1中1条数据,f2中100条数据,f3中2条数据 ...