c语言结构体中使用联合体

C&C++常用方法笔记 -结构联合体

结构体  struct

联合体 union

union,中文名“联合体、共用体”,在某种程度上类似结构体struct的一种数据结构,共用体(union)和结构体(struct)同样可以包含很多种数据类型和变量。

不过区别也挺明显:

结构体(struct)中所有变量是“共存”的——优点是“有容乃大”,全面;缺点是struct内存空间的分配是粗放的,不管用不用,全分配。

而联合体(union)中是各变量是“互斥”的——缺点就是不够“包容”;但优点是内存使用更为精细灵活,也节省了内存空间。

struct 的命名方式 

// 第二种方式,可以直接取名字

// 1. 结构体的定义和使用

// char* 不算基本数据类型

结构体的嵌套

结构体指针和动态内存开辟

// 结构体的数组

// 3. 结构体大小计算(字节对齐)

计算的规则:

 1. 按照最大的字节去计算

 2. 算得时候只会按照基本数据类型去算

 3. 首先会把所有字节数加起来,是否能够整除最大属性的字节数,如果不够为网上累加,一直加到能整除位置

 4. 结构体和结构体指针取别名

 5定义了一个 联合体

6. 联合体的定义和使用

联合体只能存在一个,要么是 age ,要么是 name

6. 联合体大小计算 (不用累加,取的最大值,最终是否够基本数据类型整除)

c语言结构体中使用联合体

C语言中的联合又什么?

联合又称联合体或共用体(union),共用体是通过成员的相互覆盖,是的几个不同的变量共占一段内存,以此大道节省内存的目的。

union

data

{

int

i;

char

c;

float

f;

}

a;

上面的作用是定义联合体,举个例子吧,就像你定义一个整型常量,如

int

b=1

上面的那段代码等同与int,他是告诉系统有这么一个变量,那么接下来就是设置一个常量了,}号后面接着的a就像int

b=1中的b一样,系统这时就会为a这一个变量分配内存空间。

上面的联合体里有3个成员,也就是说有3个变量,A选项就是正确的赋值方式,就像b赋值为1一样,如果你想对具体某个成员赋值的话,就要用到“.”号或

“-”号,通常用“.”。

c语言中的union是什么意思啊?

c语言中的union是联合体,就是一个多个变量的结构同时使用一块内存区域,区域的取值大小为该结构中长度最大的变量的值。

声明一个struct类型,为date,有一个实例变量today,如果int的大小占4个字节,第一句输出12,union表示可以有多种方法来看待这个数据类型,里面的的数据是共享内存空间的,大小应该是union中最大的类型,第二句输出8。

所在函数库为【ctype.h】

int isalpha(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)返回非0值,否则返回0

int isalnum(int ch) 若ch是字母(‘A’-‘Z’,’a’-‘z’)或数字(‘0’-‘9’)

返回非0值,否则返回0

int isascii(int ch) 若ch是字符(ASCII码中的0-127)返回非0值,否则返回0

int iscntrl(int ch) 若ch是作废字符(0x7F)或普通控制字符(0x00-0x1F)

以上内容参考:百度百科-C语言函数

C语言结构体内嵌联合问题?

联合体里边有三个成员,共享同一段内存,这是联合体的特性。

因为该联合体声明为匿名联合体,所以可以像访问一个外层的结构体变量一样直接访问联合体的成员。举个例子:

sensor a; //定义一个sensor类型的变量a

a.x=1.12; //访问匿名联合体的成员

a.y=2.34; //访问匿名联合体的成员

a.pitch=23.3; //访问匿名结构体的成员

c语言中结构体和共同体及应用不是很明白,试举例说明。

联合体(union)和结构体(struct)的区别

1. 联合说明和联合变量定义

联合也是一种新的数据类型, 它是一种特殊形式的变量。

联合说明和联合变量定义与结构十分相似。其形式为:

union 联合名{

数据类型 成员名;

数据类型 成员名;

} 联合变量名;

联合表示几个变量公用一个内存位置, 在不同的时间保存不同的数据类型 和不同长度的变量。

下例表示说明一个联合a_bc:

union a_bc{

int i;

char mm;

};

再用已说明的联合可定义联合变量。

例如用上面说明的联合定义一个名为lgc的联合变量, 可写成:

union a_bc lgc;

在联合变量lgc中, 整型量i和字符mm公用同一内存位置。

当一个联合被说明时, 编译程序自动地产生一个变量, 其长度为联合中最大的变量长度。

联合访问其成员的方法与结构相同。同样联合变量也可以定义成数组或指针,但定义为指针时, 也要用”-;”符号, 此时联合访问成员可表示成:

联合名-成员名

另外, 联合既可以出现在结构内, 它的成员也可以是结构。

例如:

struct{

int age;

char *addr;

union{

int i;

char *ch;

}x;

}y[10];

若要访问结构变量y[1]中联合x的成员i, 可以写成:

y[1].x.i;

若要访问结构变量y[2]中联合x的字符串指针ch的第一个字符可写成:

*y[2].x.ch;

若写成”y[2].x.*ch;”是错误的。

2. 结构和联合的区别

结构和联合有下列区别:

1) 结构和联合都是由多个不同的数据类型成员组成, 但在任何同一时刻, 联合转只存放了一个被选中的成员, 而结构的所有成员都存在。

2) 对于联合的不同成员赋值, 将会对其它成员重写, 原来成员的值就不存在了, 而对于结构的不同成员赋值是互不影响的。

下面举一个例了来加对深联合的理解。

main()

{

union{ /*定义一个联合*/

int i;

struct{ /*在联合中定义一个结构*/

char first;

char second;

}half;

}number;

number.i=0x4241; /*联合成员赋值*/

printf(“%c%c\n”, number.half.first, mumber.half.second);

number.half.first=’a’; /*联合中结构成员赋值*/

number.half.second=’b’;

printf(“%x\n”, number.i);

getch();

}

输出结果为:

AB

6261

从上例结果可以看出: 当给i赋值后, 其低八位也就是first和second的值;当给first和second赋字符后, 这两个字符的ASCII码也将作为i 的低八位和高八位。

帮忙修改下代码!C语言结构体和联合体

一个一个来回答:

一 可以改成这样子,因为给结构体的子项赋值就是这么做的啊–取子项的起始地址然后输入数据,但是”%s,%c,%f”这样的输入格式是有问题的,如果我输入的是001,F,13.7,那么p[i].num里存的是”001,F,13.7″,而sex,run中的内容就不确定了,因为scanf接受字符串时以空格或回车为结束标志,所以这一整串都存到num里去了,如果输入的是”001 ,F,13.7″这样num里的数据没问题,但是sex和run中的内容是错误的,我建议你把输入格式改为”%s %c %f”数据之间以空格间隔,这样输入的时候就不会出问题了;还有很重要的一点是scanf的第一个变量,p[i]有问题,p是一个结构体数组的起始地址,p[i]表示的是结构体,而我们需要的是p[i]的地址而非p[i]这个结构体,所以这里在运行的时候会出现内存错误,这里可以改为p[i](可以这样用是因为num是p[i]的第一个子项,它们的起始地址相同),或者p[i].num(num是字符数组的起始地址所以不必要加)

二 显然一中已经指出p[i]是错误的,而p[i]是正确的(通过VC++ 6.0以及DEV C++验证)

三 一中已经指出,这样做是可以的(也验证通过)

myoutput里面当sex==F时

应该printf(“%10.2f\n”,p[i].pick.jump);吧

我把我改后的源代码贴上,你可以运行试试,这些问题都明朗了

#include stdio.h

#include string.h

#define N 3

union sel

{ int body;

float jump;

};

struct student

{ char num[10];

char sex;

float run;

union sel pick;

};

void myinput(struct student *p)

{ int i=0;

float x=0,y=0;

for(i=0;iN;i++)

{ printf(“Input number,sex,100_metre dash score:”);

//scanf(“%s,%c,%f”,p[i],p[i].sex,x);/***1***/

//p[i].run=x;/***2***/

scanf(“%s %c %f”,p[i],p[i].sex,p[i].run);/***3***/

if(p[i].sex==’M’)

{ printf(“Input pull_up score:”);

scanf(“%d”,p[i].pick.body);

}

else if(p[i].sex==’F’)

{ printf(“Input long jump score:”);

//scanf(“%f”,y);/***4***/

//p[i].pick.jump=y;/***5***/

scanf(“%f”,p[i].pick.jump);/***6***/

}

else

{ printf(“Invalid sex,input again:\n”);

i–;

}

}

}

void myoutput(struct student *p)

{ int i=0;

printf(“Sport record:\n”);

printf(“number sex 100_metre pull_up jump\n”);

for(i=0;iN;i++)

{ printf(“%s %C %.2f “,p[i].num,p[i].sex,p[i].run);

if(p[i].sex==’M’)

printf(“%d\n”,p[i].pick.body);

else if(p[i].sex==’F’)

printf(“%10.2f\n”,p[i].pick.jump);

}

}

main()

{ struct student a[N];

myinput(a);

myoutput(a);

}

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月26日 10:49:02
下一篇 2024年3月26日 10:59:24

相关推荐

  • ccf考试题分蛋糕c语言,ccf考试技巧

    CCF和CSP考试有什么区别吗? CCF(Certified Customs Specialist)和CSP(Certified Supply Chain Professional)是两个不同的认证考试,它们分别涉及海关和供应链方面的专业认证。 csp是软件能力认证,也就是原信息学奥赛NOIP。NOIP是全国青少年信息学奥林匹克联赛(National Oly…

    2024年5月19日
    4100
  • c语言清除屏幕,c语言清除屏幕上已输入的内容

    c语言清屏函数是什么? clrscr函数是C语言的清除函数,它清除屏幕上的输出,clrscr是clear screen的缩写。Clrscr不是C语言的标准库函数,而是TC平台特有的函数,其他编译器无法使用。 C语言中clrscr()意思是清除文本模式窗口,将之前屏幕上显示出的文字字符去掉。 清屏,不过用这个函数不好,因为它只在TC下有用,在其它编译器下没有这…

    2024年5月19日
    3500
  • 关于c语言二进制文件的使用,c语言二进制文件的读取与写入

    C语言二进制文件的读取问题 1、数据流:程序与数据间的交互是以流的形式进行。在C语言文件存取时,打开文件操作,关闭数据流。缓冲区:程序执行时,提供的额外内存以暂时存放数据。缓冲区作用是为了提高存取效率,内存的存取速度比磁盘快。 2、C语言中二进制文件的读取要用fread和fwrite来实现。fwrite()与fprintf()是不同的。fwrite将写入的数…

    2024年5月19日
    3500
  • 求组合数c语言运用高数,c语言组合数函数

    组合数怎么求? 组合计算公式是:C(n,m)=A(n,m)/m。组合是数学的重要概念之一,它表示从n个不同元素中每次取出m个不同元素,不管其顺序合成一组,称为从n个元素中不重复地选取m个元素的一个组合。 根据阶乘的定义,4! = 4 * 3 * 2 * 1 = 24,2! = 2 * 1 = 2。将这些值带入组合数公式。计算 C(4,2) = 4! / (2…

    2024年5月19日
    3400
  • 输出月历的c语言程序,c语言打印某年某月日历

    .C语言编程“已知2000年1月1日为星期六,任意输入一年份,打印出其月历… 1、跪求一个c语言编写的日历程序(最好加上注释) 10 以1900年一月一日是星期一为基础,编写程序(要考虑闰年)。1随意输入某年某月某日就可以推算出星期几。2输出一个月的月历。 2、if(month==4||6||9||11)if(month==1||3||5||7|…

    2024年5月19日
    4000
  • c语言读取10bitraw文件,c语言 读取文件数据

    怎样读取RAW数据 1、raw格式照片可以通过以下软件打开:使用相机附的DPP软件。使用photoshop的camraRAW插件。ACDsee也可打开。CORL的PANSHOP X2X3均可以打开。 2、方法通过磁盘错误检查来修复步骤1:打开“我的电脑/此电脑”,右键点击RAW驱动器并选择【属性】。在属性窗口中切换至【工具】选项,并单击【检查】按钮。 3、电…

    2024年5月19日
    3000
  • c语言ampamp,c语言amp是什么意思

    amp是c语言哪个头文件里的 1、amp在c语言中不存在。根据查询相关信息显示,amp是c加加中的引用类型,而在c语言中是不存在的,无法使用。 2、不对,C语言编译器会用一些目录存放公共头文件,如果amp;lt;amp;gt;则只在这些目录下找头文件,如果用““先在当前目录下找,如果找不到则在这些目录下找。不可能搜索所有目录,这样效率太低。 3、c语言中的头…

    2024年5月19日
    4500
  • c语言调用restful接口,c调用c++接口

    如何通过类对象作为方法参数的RESTful服务吗 公司服务端是通过springboot提供restful接口,前端是react js 通过http请求服务端。 直接把对象作为参数传递就可以。java中的方法传参过程中传递的都是形式参数,也就是源对象在内存中的引用。 直接把对象创建出来,比如在参数中需要用到某个类对象的时候,除了上述方法以外,也可以直接把此对象…

    2024年5月19日
    3900
  • 在大学期间如何学c语言,大学期间如何学英语

    大学生如何学C语言 可以先从C语言的基础开始学习,包括变量和基本数据类型、类型转换等内容。接着可以学习C语言的输入输出函数,例如printf和scanf等。然后可以学习流程控制语句、数组、指针、结构体、枚举和共用体等特殊数据类型。 学习C语言始终要记住“曙光在前头”和“千金难买回头看”,“千金难买回头看”是学习知识的重要方法,就是说,学习后面的知识,不要忘了…

    2024年5月19日
    3800
  • c语言中memcpy什么意思,c语言中的memcpy函数

    memcpy函数用法 1、memcpy函数用法如下:memcpy函数是C/C++语言中的一个用于内存复制的函数,可以用于快速拷贝内存中的数据。 2、c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。 3、C语言memcpy函数原型:extern void *mem…

    2024年5月19日
    3600

发表回复

登录后才能评论



关注微信