C和指针 (pointers on C)——第十章:结构体和联合(上)
第十章 结构和联合
这个部分先介绍了.运算符,能够供直接訪问,还介绍了->运算符,它取代结构体指针的间接訪问操作(*struct).xxx
这一章新手理解起来不算太难,没有学过操作系统的话理解位段、对齐等概念会有一些问题。
越发的说明了指针和内存绝对是C的核心。
总结:
结构声明列出了结构包括的成员列表,不同类型的值能够存储在一起。
不同的结构声明即使他们的成员列表同样也被觉得是不同的类型。
声明结构时使用typedef创建一种新类型是一个好方法。
typedef struct
{
int a;
char b;
float c;
}simple;
跟结构标签的结果差点儿同样。差别在于simple如今是一个类型名而不是结构体,以后声明就是以下这个样子。
simple x;
simple y[20], *z;
结构不能包括类型也是这个结构的成员,否则在分配地址的时候,会出现无穷大。可是能够包括一个指向这个结构的指针。
这个经常常使用在链式结构中。为了声明两个结构,每一个结构都包括一个指向对方的指针的成员。
初始化的时候能够由一个花括号包围的值列表进行初始化。
编译器为一个结构变量的成员分配内存时要满足它们的边界对齐要求。在实现结构存储的边界对齐时,可能会浪费部分空间。依据边界对齐要求降序排列结构成员能够最大限度地降低结构存储中浪费的内存空间。
假设想要降低对齐造成的损失,一般来说声明的过程中要降序排列。能够利用offstof宏(stddef.h)+sizeof来找个更好的办法。
结构能够作为形參传递给函数,也能够作为返回值返回可是绝对不提倡!!!严重浪费内存空间。
最好形參和返回值都用指针,假设怕改动结构本身,那么就加个const!
位段个人不是理解非常深,理解来看是能够将长度为奇数的值包装在一起节省空间。
Union和struct是两个不同的故事。全部Union的成员都存储于同一个内存位置。也能够进行初始化,可是初始化必需与联合第一个成员类型匹配。
关于初始化:
union{
int a;
float b;
char c[4];
} x = {5};
这样就把x.a初始为5。
警告:
1、具有同样成员列表的结构声明产生不同类型。
这就像函数一样,跟声明关系非常大。
2、使用typedef为一个自引用的结构定义名字时应该小心。
自引用一定要记住,要引用指针。
3、向函数传递结构參数是低效的。
要对内存的形參进行拷贝,这份拷贝放在内存里实在是太浪费空间。
编程提示:
1、typedef声明放在头文件里。到是用到就#include回来。
2、结构成员的最佳排列形式并不一定就是考虑边界对齐而浪费内存空间最少的那种排列方式。
非常显然,为了对齐,有时候你不得不打乱声明的顺序,从而导致可读性的减少。
3、把位段成员显式得声明为signed int 或者 unsigned int类型。
4、位段是不可抑制的。
5、位段使源码中位的表达式更加清楚。
问题:
1、成员和数组元素有什么差别?
成员能够具备不同的类型,数组不行。
2、结构名和数组名有什么不同?
数组名是一个指针常量。可是结构名就是个标签tag,跟class名类似,没有实例的话,是不会对其分配内存的。
3、结构的声明:
struct tag{member-list } variable-list;
tag、member-list、variable-list三者必需有二。
C和指针 (pointers on C)——第十章:结构体和联合(上)的更多相关文章
- C语言入门第十章----结构体
C语言结构体从本质上讲是一种自定义的数据类型,只不过这种数据类型比较复杂,是由int.char .float等基本类型组成的,你可以认为结构体是一种聚合类型. 在实际开发中,我们可以将一组类型不同的. ...
- C/C++中指向结构体变量的指针,调用指向的那个结构体中的成员
设p是指向结构体变量的指针,则可以通过以下的方式,调用指向的那个结构体中的成员: (1)结构体变量.成员名.如,stu.num. (2)(*p).成员名.如,(*p).num. (3)p->成员 ...
- C学习笔记(5)--- 指针第二部分,字符串,结构体。
1. 函数指针(function pointer): 函数指针是指向函数的指针变量. 通常我们说的指针变量是指向一个整型.字符型或数组等变量,而函数指针是指向函数. 函数指针可以像一般函数一样,用于调 ...
- 函数指针,使用qsort,进行结构体排序
#include <stdio.h> #include <stdlib.h> #define STU_NAME_LEN 16 /*学生信息*/ typedef struct s ...
- 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. ...
- C语言结构体里的成员数组和指针
struct test{ int i; char *p; }; struct test *str; ; char *b = "ioiodddddddddddd"; str = (s ...
- 【C语言入门教程】7.3 结构体指针的定义和引用
C 语言中指针的操作非常灵活,它也能指向结构体变量对结构体变量进行操作.在学习结构指针之前,需要再次加深对指针的认识.声明指针变量时所使用的数据类型修饰符实际上的作用是定义指针访问内存的范围,如果指针 ...
- c语言结构体指针初始化
今天来讨论一下C中的内存管理. 记得上周在饭桌上和同事讨论C语言的崛起时,讲到了内存管理方面 我说所有指针使用前都必须初始化,结构体中的成员指针也是一样 有人反驳说,不是吧,以前做二叉树算法时,他的左 ...
随机推荐
- goahead 移植
1.网上下载goahead-3.1.-0-src.tgz包 2.解压 tar -zxvf goahead-3.1.-0-src.tgz 3.编译 cd goahead-3.1.-0 make CC=a ...
- ViewPager,模仿慕课网
源码:http://pan.baidu.com/s/1DhM14 使用fragment实现的:http://pan.baidu.com/s/1mgzWlM4 SecondActivity.java p ...
- ring0和ring3的区别
现在探讨内核程序和应用程序之间的本质区别.除了能用WDK编写内核程序和阅读一部分Windows的内核代码之外,我们还需要了解它们的本质是什么,它们和我们熟悉的应用程序有什么区别. Intel的x86处 ...
- HTTPS 中双向认证SSL 协议的具体过程
HTTPS 中双向认证SSL 协议的具体过程: 这里总结为详细的步骤: ① 浏览器发送一个连接请求给安全服务器.② 服务器将自己的证书,以及同证书相关的信息发送给客户浏览器.③ 客户浏览器检查服务器送 ...
- php language construct 语言构造器
isset和empty看起来像是函数,我们也经常把它当作函数一样使用,但是实际上,它们是语言构造器. php中的语言构造器就相当于C中的预定义宏的意思,它属于php语言内部定义的关键词,不可以被修改, ...
- 基于storm的在线关联规则
基于storm的在线视频推荐算法.算法根据youtube的推荐算法 算法相对简单,能够觉得是关联规则仅仅挖掘频繁二项集.以下给出与storm的结合实如今线实时算法 , 关于storm见这里.首先给出 ...
- IOS开发中UIBarButtonItem上按钮切换或隐藏实现案例
IOS开发中UIBarButtonItem上按钮切换或隐藏案例实现案例是本文要介绍的内容,这个代码例子的背景是:导航条右侧有个 edit button,左侧是 back button 和 add bu ...
- Arduino 入门程序示例之一个 LED(2015-06-11)
前言 答应了群主写一些示例程序,一直拖延拖延拖延唉.主要还是害怕在各大高手面前班门弄斧……(这也算是给拖延症找一个美好的理由吧),这几天终于下决心要写出来了,各位高手拍砖敬请轻拍啊. 示例程序 首先是 ...
- 【转】centOS上安装redis+phpredis2.2.4扩展
原文链接:http://www.cnblogs.com/xsi640/p/3756130.html 我原来的安装方式:http://www.cnblogs.com/wuling129/p/464738 ...
- java--equal&==
[转自]http://blog.csdn.net/yiqunattack/article/details/5727143 [非常详细的介绍了string的用法http://blog.csdn.net/ ...