结构也可以作为传递给函数的参数,它们也可以作为返回值从函数返回,相同类型的结构体变量相互之间可以赋值

申明结构时使用另一种良好技巧是用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(结构和联合)的更多相关文章

  1. c语言指针疑惑[转载]

    c99的动态数组是在栈上面开辟的,而new出来的是在堆上面开辟的.栈和堆的地址是从两端相向增长的.栈很小,一般只有几十k,vc6好像是64k.堆很大,在win32的虚拟地址空间可以分配到2g的内存.栈 ...

  2. C的指针疑惑:C和指针8数组

    ]; ]; 上面申明两个数组,不能进行以下赋值 b = a; 你不能使用赋值符把一个数组的所有元素复制给另一个数组,必须使用一个循环,每次复制一个元素 数组和指针 ]; int *b; 声明一个数组, ...

  3. c/c++ 指针数组 和 数组指针

    看这个标题都要晕了,我们不妨把他拆开来理解,比较容易 指针数组:对象是一个数组,数组元素的类型是指针 指针数组的定义方式: 类型名 *数组名[数组长度]; 如: int *p[8]; 数组指针:对象是 ...

  4. 指针数组 vs 数组指针

        指针数组,故名思义,就是指针的数组,数组的元素是指针:     数组指针,同样,就是直想数组的指针.     简单举例说明:     int *p[2]; 首先声明了一个数组,数组的元素是in ...

  5. [Reprint]C++普通函数指针与成员函数指针实例解析

    这篇文章主要介绍了C++普通函数指针与成员函数指针,很重要的知识点,需要的朋友可以参考下   C++的函数指针(function pointer)是通过指向函数的指针间接调用函数.相信很多人对指向一般 ...

  6. (一)二维数组&&指针数组与数组指针

    一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...

  7. 【C++】指针数组和数组指针

    首先的首先,稍微抱怨一下阿里今天的严重失误.说好的晚六点笔试,说好的务必提前半小时到场.六点十五的时候告诉闷在一个大教室里躁动的我们“今天七点半开考,大家先回去吧,七点半再过来”,满脸黑线…等到七点半 ...

  8. [c/c++]指针数组 pk 数组指针

    首先强调 指针数组归根结底是个数组:数组指针归根结底是个指针. 数组指针 以int (*int)[10]为例 ()的优先级大于[],因此首先它是一个指针,它指向一个数组,数组的维数是10.因此数组指针 ...

  9. c语言指针函数与函数指针

    例一:指针函数 指针函数是指带指针的函数,即本质是一个函数.函数返回类型是某一类型的指针 类型标识符    *函数名(参数表) int *f(x,y); 首先它是一个函数,只不过这个函数的返回值是一个 ...

随机推荐

  1. pip和 easy_insall的区别

    作为Python爱好者,如果不知道easy_install或者pip中的任何一个的话,那么......   easy_insall的作用和perl中的cpan,ruby中的gem类似,都提供了在线一键 ...

  2. 关于ajax跨域的一些说说

    跨域:跨当然是跨过去,域当然是别的服务器 (说白点就是去别服务器上取东西) 只要协议.域名.端口有任何一个不同,都被当作是不同的域 ajax 是一种请求响应无刷新技术(xmlhttqrequest对象 ...

  3. 关于Unity中的transform组件(三)

    game_root节点下右一个Cube子节点,和一个Sphere节点,脚本挂载在game_root下 四元数:(1)Quaternion rot (2)this.cube.rotation 欧拉角:V ...

  4. 008Maven_建立私服

    参考博客:http://blog.csdn.net/fengspg/article/details/22507737   .1. Maven私服 关于中央仓库注意事项 l  地址: 目前来说: htt ...

  5. 输出JS代码中的变量内容

    一. 输出JS代码中的变量内容 1. 可以直接以提示框的形式输出 alert("输出的内容"); 2. 可以输出到网页的某个位置 a. 在显示输出的位置放一个标签 <a id ...

  6. MapReduce与Hadoop之比较

    MapReduce与Hadoop之比较 Hadoop是Apache软件基金会发起的一个项目,在大数据分析以及非结构化数据蔓延的背景下,Hadoop受到了前所未有的关注. Hadoop是一种分布式数据和 ...

  7. 【noip模拟题】藏宝图(prim)

    好神的一题.. 一开始没想多久就看题解了QAQ.. 首先我们发现,这棵树任意两个点的边一定是最小的(即所有其它这两个点的路径都比这条边大,才有可能出解) 然后生成树后再算距离判断即可.. 注意特判n= ...

  8. Python爬虫(七)

    源码: import requests import re from my_mysql import MysqlConnect # 获取详情页链接和电影名称 def get_urls(page): u ...

  9. Windows游戏编程大师技巧之三角形填充

    一.三角形的种类 三角形一般可以分为如下的四种类型(这四种类型是对于计算机来说的,不是数学意义上的分类): 平顶三角形:就是在计算机中显示的上面两个顶点的Y坐标相同. 平底三角形:就是在计算机中显示的 ...

  10. 追踪溯源--抓住隐藏在NAT后面的罪犯

    零.绪论: 水一篇,很小,只是一点思路记录,在工作中经常遇到的一类小问题.NAT后面的地址如何追查下去,推动网络整改不现实,总还要有一些手段来确认. 一.背景: 全球IPv4地址越来越少,也越来越贵, ...