C语言——结构体
struct 是一种把一些数据项组合在一起的数据结构。在Go,Rust这些新语言中都保留了结构体 struct 的概念,这是C的精华。
定义匿名结构体
例:学生信息定义为一个结构体,信息内容包括学生的姓名(string)、学号(long)、年龄(int)等,就可以声明如下:
struct {
    char sName[];
    long sNo;
    int sAge;
};  
定义结构体变量
结构体本质是一种数据类型,和C语言的内置内型(char,int,long ...)类似,我们可以用它来定义变量,如:
// 定义一个学生jack就可以这样:
struct {
char sName[];
long sNo;
int sAge;
} jack ; // 如还要再定义一个学生rose;
struct {
char sName[];
long sNo;
int sAge;
} rose;
定义结构体类型
我们就发现每次定义一个这样的结构体变量非常麻烦,每次都要将结构体类型声明完整写一遍,于是就引进了在struct关键字后面加上“结构标签”,例如上面的结构体就可声明为:
struct stuInfo{
    char sName[];
    long sNo;
    int sAge;
};
定义变量:
struct stuInfo jack;
struct stuInfo rose;
以OOP的角度来看,struct stuInfo是一种"类型"。
使用typedef定义新类型
到这里就更有OOP的Class的味道了。
在使用 typedef 时,struct的定义可以直接使用匿名结构体,使用typedef定义新类型名:
typedef struct {
    char a;
    int b;
    char c;
    int d;
} DATA;
对于已经被定义名称的struct,可以通过typedef对类型增加名称。
例:将上面的struct stuInfo重新命一个名字,如叫sInfo:
typedef struct stuInfo sInfo;
定义变量:
sInfo jack;
sInfo rose;
sInfo就是一个"类型"。
将上面几步融合一起,就是我们通常所使用的定义结构体变量的方法:
先声明一个结构体:
typedef struct stuInfo{
    char sName[];
    long sNo;
    int sAge;
} sInfo;
再定义变量:
sInfo jack, rose;
结构体赋值
struct中未被初始化的成员默认为0(指针类型的成员默认为NULL)。
顺序赋值
struct User oneUser = {, "Lucy", "/home/Lucy"}; 
乱序赋值
struct User oneUser = {
    .name = "Lucy",
    .id = ,
    .home = "/home/Lucy"
};
还有一种乱序赋值,常出现在C++代码中,非常像JSON格式。
struct User oneUser = {
    name:"Lucy",
    id:,
    home:"/home/Lucy"
}; 
嵌套类型
类型嵌套,可以使用typedef重定义的类型名,也可以使用struct 类型作为声明。
类型自嵌套,无法使用typedef重定义的类型名,只能直接使用struct类型作为声明。
例:如下代码是一个通用链表的struct。
typedef struct myNode {
    void * data;
    struct myNode *next;
} MyNode;
typedef struct myList {
    MyNode * first;
    MyNode * last;
    int count;
    int (*equal)(void * a, void * b);
} MyList;
结构体内存对齐问题
先说结论:写结构体时,尽量将同类型的数据放在一起,这样会节省内存分配的空间。
看例子:
#include <stdio.h>
#include <stdlib.h> int main(void) { struct {
int age;
char firstName;
char secondName;
} xiaoming; struct {
char firstName;
int age;
char secondName;
} xiaohong; int mLen =sizeof(xiaoming);
int hLen =sizeof(xiaohong); printf ("%d %d\n",mLen, hLen);
return EXIT_SUCCESS;
}
输出: 8 12
为什么?这里暂时不研究了。引一篇博客:
《结构体字节对齐》 http://www.cnblogs.com/longlybits/articles/2385343.html
C语言——结构体的更多相关文章
- 漫谈C语言结构体struct、公用体union空间占用
		
先用代码说话: #include<stdio.h> union union_data0{ int a ;//本身占用4个字节 char b ;//本身占用1个字节 int c ; }; u ...
 - 解析C语言结构体对齐(内存对齐问题)
		
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
 - 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符
		
[源码下载] 不可或缺 Windows Native (8) - C 语言: 结构体,共用体,枚举,类型定义符 作者:webabcd 介绍不可或缺 Windows Native 之 C 语言 结构体 ...
 - Go语言结构体(struct)
		
Go 语言结构体 Go 语言中数组可以存储同一类型的数据,但在结构体中我们可以为不同项定义不同的数据类型. 结构体是由一系列具有相同类型或不同类型的数据构成的数据集合. 结构体表示一项记录,比如保存图 ...
 - C语言结构体定义的几种方法
		
什么是结构体? 在C语言中,结构体(struct)指的是一种数据结构,是C语言中聚合数据类型(aggregate data type)的一类.结构体可以被声明为变量.指针或数组等,用以实现较复杂的数据 ...
 - 对嵌入式开发C语言结构体的一点总结
		
今天冬至居然不上班,公司的良心啊!这回有心情写博客和日志了,好了,废话不多说.直接看下文: 鉴于嵌入式开发过程中,C语言结构体的使用当然是必不可少.话说,基础什么的比你会更牛逼的算法更重要,基础不牢, ...
 - C语言结构体变量私有化
		
操作系统 : CentOS7.3.1611_x64 gcc版本 :4.8.5 问题描述 C语言结构体定义中的变量默认是公有(Public)属性,如果实现成员变量的私有(Private)化? 解决方案 ...
 - 在C语言结构体中添加成员函数
		
我们在使用C语言的结构体时,经常都是只定义几个成员变量,而学过面向对象的人应该知道,我们定义类时,不只是定义了成员变量,还定义了成员方法,而类的结构和结构体非常的相似,所以,为什么不想想如何在C语言结 ...
 - 将c语言的结构体定义变成对应的golang语言的结构体定义,并将golang语言结构体变量的指针传递给c语言,cast C struct to Go struct
		
https://groups.google.com/forum/#!topic/golang-nuts/JkvR4dQy9t4 https://golang.org/misc/cgo/gmp/gmp. ...
 - Linux C语言结构体-学习笔记
		
Linux C语言结构体简介 前面学习了c语言的基本语法特性,本节进行更深入的学习. 预处理程序. 编译指令: 预处理, 宏定义, 建立自己的数据类型:结构体,联合体,动态数据结构 c语言表达式工具 ...
 
随机推荐
- winform中设置FormBorderStyle为None后点击任务栏自动最小化实现
			
在winform编程中,有时候我们可能对窗体样式需要定义,不适用系统自带的样式,这样我们可以设置FormBorderStyle属性为None.但是设置了FormBorderStyle为None后,我们 ...
 - 【译】 AWK教程指南 5AWK中的数组
			
awk程序中允许使用字符串当做数组的下标(index).利用这个特色十分有助于资料统计工作.(使用字符串当下标的数组称为Associative Array) 首先建立一个数据文件,并取名为 reg.d ...
 - MFC控件
			
控件的通知消息 控件的消息映射宏的格式大致是: ON_通知消息码(nID, memberFun) //nID参数是控件的ID,memberFun参数是消息处理函数名.例如,ON_BN_CLICKED( ...
 - Ajax解决缓存的5种方法
			
原文:http://www.ido321.com/129.html 1.在ajax发送请求前加上 anyAjaxObj.setRequestHeader(“If-Modified-Since”,”0″ ...
 - bzoj 3263 陌上花开(cdq分治,BIT)
			
[题意] 求满足Ai<=Aj,Bi<=Bj,Ci<=Cj的数对的数目. [思路] cdq分治 借网上一句话:第一维排序,第二维cdq分治,第三维树状数组维护. 首先合并三维都是相 ...
 - POJ3922 A simple stone game
			
网上有很多解题报告,我的理解就是可以用类似数学归纳的方法证明,就是取一个数,让对手进入必败态. 详细见论文.
 - UITextView详解
			
self.textView = [[[UITextView alloc] initWithFrame:self.view.frame] autorelease]; //初始化大小并自动释放 sel ...
 - 修改HTMLTestRunner模板
			
---恢复内容开始--- 1.修改bug(passCase不标色和加粗) style = (n == 2 and 'errorCase') or (n == 1 and 'failCase') or ...
 - 剑指OFFER之复杂链表的复制(九度OJ1524)
			
题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点). 输入: 输入可能包含多个测试样例,输入以EOF结束.对于每个测试案例,输入的第一 ...
 - MySQL订单分库分表多维度查询
			
转自:http://blog.itpub.net/29254281/viewspace-2086198/ MySQL订单分库分表多维度查询 MySQL分库分表,一般只能按照一个维度进行查询. 以订单 ...