C的指针疑惑:C和指针10(结构和联合)
结构也可以作为传递给函数的参数,它们也可以作为返回值从函数返回,相同类型的结构体变量相互之间可以赋值。
申明结构时使用另一种良好技巧是用typedef创建一种新的类型。
typedef struct{
int a;
char b;
float c;
}Simple;
与
struct SIMPLE {
int a;
char b;
float c;
} ;
struct SIMPLE x;
struct SIMPLE y[],*z;
区别:SIMPLE是一个结构标签,而Simple是类型名而不是个结构标签
所以类型名声明变量是这样:
Simple X;
Simple y[],*Z;
如果你想在多个源文件中使用同一种类型的结构,你应该把标签声明或者typedef形式的声明放在一个头文件中。当源文件需要这个声明时可以使用#include指令把那个头文件包含进来。
结构成员的直接访问
结构变量的成员是通过点操作符(.)访问的。
结构成员的间接访问、
struct COMPLEX *p p->f
结构的自引用
struct SELF_REF1{
int a;
struct SELF_REF1 b;
int c;
};
这是非法的,最后导致重复下去永无止境。
struct SELF_REF2{
int a;
struct SELF_REF2 *b;
int c;
};
这个声明和前面那个声明的区别在于b现在是一个指针而不是结构。编译器在结构的长度确定前就已经知道指针的长度,所以这种类型的自引用是合法的。
这种应用事实上所指向的是同一种类型的不同结构。更加高级的数据结构,如链表和树,都是用这种技巧实现的。每个结构指向链表的下一个元素或树的下一个分支。
警告警惕这个陷阱
typedef struct{
int a;
SELF_REF3 *b;
int c;
}SELF_REF3;
这个声明的目的是为这个结构创建类型名SELF_REF3。但是,它失败了。类型名直到声明的末尾才定义,所以在结构声明的内部它尚未定义。
解决方案:用一个结构标签声明b
typedef struct SELF_REF3_TAG{
int a;
struct SELF_REF3_TAG *b;
int c;
}SELF_REF3;
位段
位段的声明和任何普通的结构成员声明相同,但有两个例外。首先,位段成员必须声明位int.signed int
或unsigned int类型。其次,在成员名的后面是一个冒号和一个整数,这个整数指定该位段所占用的位的数目。
struct CHAR{
unsigned ch : ;
unsigned fomt :;
unsigned size :;
};
struct CHAR ch1;
联合的所有成员引用的是内存中的相同位置。
在一个成员长度不同的联合里,分配给联合的内存数量取决于它的最长成员的长度。
如果成员间的长度相差悬殊,当存储长度较短的成员时,会浪费的空间是相当可观的。此时,在联合中存储指向不同成员的指针而不是直接存储成员本身。解决了内存浪费的问题。
联合的初始化
联合变量可以被初始化,但这个初始值必须是联合第1个成员的类型,而且它必须位于一对花括号里面。
C的指针疑惑:C和指针10(结构和联合)的更多相关文章
- c语言指针疑惑[转载]
c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...
- C的指针疑惑:C和指针8数组
]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...
- c/c++ 指针数组 和 数组指针
看这个标题都要晕了,我们不妨把他拆开来理解,比较容易 指针数组:对象是一个数组,数组元素的类型是指针 指针数组的定义方式: 类型名 *数组名[数组长度]; 如: int *p[8]; 数组指针:对象是 ...
- 指针数组 vs 数组指针
指针数组,故名思义,就是指针的数组,数组的元素是指针: 数组指针,同样,就是直想数组的指针. 简单举例说明: int *p[2]; 首先声明了一个数组,数组的元素是in ...
- [Reprint]C++普通函数指针与成员函数指针实例解析
这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下 C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...
- (一)二维数组&&指针数组与数组指针
一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...
- 【C++】指针数组和数组指针
首先的首先,稍微抱怨一下阿里今天的严重失误.说好的晚六点笔试,说好的务必提前半小时到场.六点十五的时候告诉闷在一个大教室里躁动的我们“今天七点半开考,大家先回去吧,七点半再过来”,满脸黑线…等到七点半 ...
- [c/c++]指针数组 pk 数组指针
首先强调 指针数组归根结底是个数组:数组指针归根结底是个指针. 数组指针 以int (*int)[10]为例 ()的优先级大于[],因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针 ...
- c语言指针函数与函数指针
例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符 *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...
随机推荐
- [android] AndroidManifest.xml【 manifest -> permission-tree 和 manifest -> permission-group】
permission-tree 权限树 <permission-tree android:icon="drawable resource" android:label=&qu ...
- 115个Java面试题和答案(下)
转自:http://www.importnew.com/11028.html 第一篇讨论了面向对象编程和它的特点,关于Java和它的功能的常见问题,Java的集合类,垃圾收集器,本章主要讨论异常处 ...
- PyCharm中设置console端的字体和大小
file--->setting,选择console Font,右侧primary font即设置console端的字体和大小
- 编译内核出现"mkimage" command not found - U-Boot images will not be built
参考链接: http://spyker729.blogspot.com/2010/07/mkimage-command-not-found-u-boot-images.html 制作uImage的工具 ...
- selenium 获取按钮的笔记
测试odoo时,发现大部分按钮都是动态生成,id也是动态的, 只能用xpath,但是配置一旦改变导致按钮位置改变 想到一个办法,遍历所有按钮,然后内容相符的才点击,测试代码如下 submit_loc ...
- 【BZOJ】1650: [Usaco2006 Dec]River Hopscotch 跳石子(二分+贪心)
http://www.lydsy.com/JudgeOnline/problem.php?id=1650 看到数据和最小最大时一眼就是二分... 但是仔细想想好像判断时不能贪心? 然后看题解还真是贪心 ...
- Codeforces Round #311 (Div. 2) A,B,C,D,E
A. Ilya and Diplomas 思路:水题了, 随随便便枚举一下,分情况讨论一下就OK了. code: #include <stdio.h> #include <stdli ...
- 第十六篇:Linux系统编程中环境变量的使用
前言 在 UNIX Like 系统中,存有各类系统/应用程序的环境变量,可通过修改之改变系统/应用程序的执行效果:除此之外,用户还可以定义自己的环境变量,供自己写的程序使用. 本文将说明如何在程序中设 ...
- 在VS2013下如何配置DirectX SDK的开发环境_百度经验
jpg改rar
- 【BZOJ3809/3236】Gty的二逼妹子序列 [Ahoi2013]作业 莫队算法+分块
[BZOJ3809]Gty的二逼妹子序列 Description Autumn和Bakser又在研究Gty的妹子序列了!但他们遇到了一个难题. 对于一段妹子们,他们想让你帮忙求出这之内美丽度∈[a,b ...