结构与联合

  1. 结构和联合都是由多个不同的数据类型成员组成,但在任何同一时刻,联合中只存放了一个被选中的成员(所有成员共用一块地址空间),而结构的所有成员都存在(不同成员的存放地址不同)。
  2. 对于联合的不同成员赋值,将会对其它成员重写,原来成员的值就不存在了,而对于结构的不同成员赋值是互不影响的。
#include <stdio.h>
union{
  int i;
  char x[2];
}a;
int main(){
    a.x[0] = 10;
    a.x[1] = 1;
    printf("%d", a.i);
}

结果是266(低位低地址,高位高地址,内存占用情况0x010A)

int main(){
    union{
        int i;
        struct{
            char first;
            char second;
        }half;
    }number;
    number.i = 0x4241;
    printf("%c%c\n", number.half.first, number.half.second);
    number.half.first = ‘a‘;
    number.half.second = ‘b‘;
    printf("%x\n", number.i);
    return 0;
}

AB(0x41,对应‘A’,是低位;0x42,对应‘B’,是高位)

6261(number.i和number.half共用一块地址空间)

时间: 2024-08-26 10:26:25

结构与联合的相关文章

扎实学习C语言(二)结构和联合

关于结构体的一个问题: 看下面这个结构体的声明,把它记作A struct node { int a; float b; struct node *next; }s; 和如下的结构体声明,把它记作B struct node { int a; float b; struct node next; }s; 他们的区别是啥? 今天学习<C和指针>第10章,以前,没注意过这个问题,现在对声明和定义的理解又深了一点 声明是要告诉编译器,这个甜饼机做出来的甜饼有多大,但是甜饼机不是甜饼本身,定义就是甜饼本身

C语言的结构和联合,以及PHP是怎么实现弱类型的

C语言的结构(struct):包含多个成员,可能有多种数据类型,并且需要分配几种类型占用空间之和的空间. 联合(union):支持多种类型,供使用者使用其中一种数据类型,当然是需要分配其中占用空间最大的数据类型的大小. 结构和联合通常是出现在一块的. PHP是用C语言来实现的,那么思考下为什么PHP可以实现弱类型呢? 答案就在C语言的结构和联合上. 从弱类型变量的写入和读取二者分析: 有了联合,我们可以定义几种类型,让php的变量在其中选取,这个可以解决变量写入.那怎么解决读取这个变量呢?变量设

C和指针 第十章 结构和联合 习题

1. 记账信息结构联合 typedef struct { unsigned int areaNum; unsigned int transNum; unsigned int station; } phoneNumber; struct { phoneNumber fromPhone; phoneNumber toPhone; phoneNumber payPhone; } dialHistory; 2. 指令解码: #include <stdio.h> typedef struct { uns

C和指针 第10章 结构和联合 (二)

结构体传值: 结构体也是标量,像字符和整数一样,可以传递给一个函数,但是传入整个结构体效率很低,可以传入指向结构体的指针来提高效率.如果不希望程序对结构体变量改变可以加入const关键词. typedef struct { int id; int num; char name[100]; } Produts; //传入指针,加const修饰,防止程序修改 void test(Produts const *ptr); 位段: 结构体可以实现位段,位段的声明和结构体类型,但是成员是多个位的字段,不同

《你必须知道的495个C语言问题》读书笔记之第2章:结构、联合和枚举

1. Q:下面两个声明有何区别? struct x1 {...}; typedef struct {...} x2; A:第一种形式声明了一个“结构标签”,第2种形式声明了一个“类型定义”.前者在声明结构的实例时必须使用struct关键字,如"struct x1 a;",后者则不需要使用struct关键字,如"x2 b;".但这个区别在C++编译器和某些模仿C++的C编译器中已经完全不存在了,在C++中结构标签在本质上都自动声明为类型定义. 2. Q:在C语言中是否

动态分配,结构,联合

(一)动态内存分配: 1.为什么要动态内存分配呢?比如,我要做一个学生成绩管理系统,这里可能需要存储每个班级所有学生的信息,但 是,我们到底要分配多大的空间呢??每个班的人数有可能并不相等,按多分配 ,那样多浪费:按少分配,不够.所以 动态内存分配就有自己的作用了~~ 2.动态内存分配函数: (1)void *malloc(unsigned  int  size);-------size是需要分配的字节数. (2)void *calloc(unsigned int num_elements,un

C++中,什么叫类,结构,联合?

在C++中 class 和 struct 本质上一样 可以互用class的成员默认是private的,struct的成员默认是public的但一般习惯把成员变量隐藏的用class申明, 成员变量可以公开访问并且比较简单的用struct申明(个人理解是struct是从c来的,在c中就是那么用的) 至于union,不论其内部有多少成员,在任意时刻,只有一个可用,因为所有成员公用的一个地址例如union A{int a;float f;struct ST st;};中的三个变量 a,f,st的地址都是

C和指针 (pointers on C)——第十章:结构体和联合(上)

第十章 结构和联合 这个部分先介绍了.运算符,可以供直接访问,还介绍了->运算符,它代替结构体指针的间接访问操作(*struct).xxx 这一章新手理解起来不算太难,没有学过操作系统的话理解位段.对齐等概念会有一些问题. 越发的说明了指针和内存绝对是C的核心. 总结: 结构声明列出了结构包含的成员列表,不同类型的值可以存储在一起. 不同的结构声明即使他们的成员列表相同也被认为是不同的类型. 声明结构时使用typedef创建一种新类型是一个好方法. typedef struct { int a;

关于结构体占用空间大小总结(#pragma pack的使用)

关于C/C++中结构体变量占用内存大小的问题,之前一直以为把这个问题搞清楚了,今天看到一道题,发现之前的想法完全是错误的.这道题是这样的: 在32位机器上,下面的代码中 class A { public: int i; union U { char buff[13]; int i; }u; void foo(){} typedef char* (*f)(void*); enum{red , green, blue}color; }a; sizeof(a)的值是多少?如果在代码前面加上#pragm