C语言的结构体位定义问题

作者&投稿:曲胁 (若有异议请与网页底部的电邮联系)
C语言结构体成员定义引用问题~

没有
A={ .age=10; .class=3;};这种赋值方法,改成
A.age=10;A.cass=3;或
B->age=10;B->class=3;都行。
另:class是C++关键字,若使用的是C++兼容的C编译器,则过不了编译,应另起一名,如Class,或classs等。

C语言给结构体定义别名用typedef关键字操作,就两种情况:
给结构体起一个别名,如:
typedef struct ABC{...
}S;——这就为结构体ABC定义了一个别名S。以后写S x;就等价于写struct ABC x;了。
给结构体指针起一个别名,如:
typedef struct ABC{
...
}*PS;——这就为结构体指针ABC *定义了一个别名PS。以后写PS pt;就等价于写struct ABC *pt;了。注意这里是用typedef给struct ABC{...} *起一个别名PS,而不是给struct ABC{...}起一个别名*PS——后者是说不通的,起码的错误是标识符不可能以*开头!

按照名字定义,u无符号 int 整形,数字 8 16,表示多少位的整形, 

1字节     uint8_t

2字节     uint16_t

4字节     uint32_t

8字节     uint64_t

详情参考:http://www.cnblogs.com/baochun968/archive/2011/10/19/2218008.html


bit0:1这句话定义了一个位域,bit0是该位域的域名,而且bit0只占用一个位。

位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示。

参考:http://zhidao.baidu.com/question/391684179.html


所以上面的结构体,一个元素属性占一位,前面的是2字节,后面也是两个字节。本质上没有区分吧


常规下可以这样测试上面的代码


#include<stdio.h>
typedef unsigned short uint16_t ;
typedef unsigned char uint8_t ;
typedef struct
{
uint16_t bit0:1;
uint16_t bit1:1;
uint16_t bit2:1;
uint16_t bit3:1;
uint16_t bit4:1;
uint16_t bit5:1;
uint16_t bit6:1;
uint16_t bit7:1;
uint16_t bit8:1;
uint16_t bit9:1;
uint16_t bit10:1;
uint16_t bit11:1;
uint16_t bit12:1;
uint16_t bit13:1;
uint16_t bit14:1;
uint16_t bit15:1;
}BITS161;
typedef struct
{
uint8_t bit0:1;
uint8_t bit1:1;
uint8_t bit2:1;
uint8_t bit3:1;
uint8_t bit4:1;
uint8_t bit5:1;
uint8_t bit6:1;
uint8_t bit7:1;
uint8_t bit8:1;
uint8_t bit9:1;
uint8_t bit10:1;
uint8_t bit11:1;
uint8_t bit12:1;
uint8_t bit13:1;
uint8_t bit14:1;
uint8_t bit15:1;
}BITS162;
int main(){
printf("%d,%d",sizeof(BITS161),sizeof(BITS162));
return 0;
}


输出为2,2,表示结构体都是两个字节。但是如果typedef unsigned int uint16_t ; 就是用通常的4字节整形表示uint16_t ,上面的结构体至少要一个int长度 ,输出为4,2



1.我认为uint16_t这是你定义的一个新类型
typedef unsigned short uint16_t; /*就是定义无符号短整型为 uint16_t*/
typedef unsigned char uint8_y; /*定义无符号char型为 uint8_t*/
两个结构体中只有这地方不同,对于第二个结构提,因为char型,只有8位,当超过8bit时,会自动的申请新的字节进行存储,因此第二个字节使用2个1字节存储,而第一个结构体使用1个2字节存储。

2.对于冒号,这是C语言中位域的用法,有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。
例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可。为了节省存储空间,并使处理简便。所谓“位域”是把一个字节中的二进位划分为几个不同的区域, 并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。 这样就可以把几个不同的对象用一个字节的二进制位域来表示
具体例子如下:
#include <stdio.h>

typedef unsigned char u8;

/*定义新类型,这个新类型由4部分组成,每部分只占无符号char型8bit
中的几bit*/
typedef struct _my_bit_
{
u8 one:1;
u8 two:2;
u8 three:3;
u8 four:2;
}mybitfiled;

int main()
{
mybitfiled mybit;
/*注意位域分配的位个数,例如one只分配了1bit,那么mybit.one只能为1或0,
如果输入2的话,那么会提示将多余部分给删掉的,意思只能取最后1bit的信息*/

mybit.one = 1;
mybit.two = 2;
mybit.three = 3;
mybit.four = 1;
printf("sizeof(mybit) = %d,%d %d %d %d\n",sizeof(mybit),mybit.one,mybit.two,mybit.three,mybit.four);

return 0;
}

前面用一个2字节整型16位比特来做数据结构,后面用2个1字节整型16位比特来做数据结构。

uint16_t bit0:1的意思是取16位比特中的一位用于存放bit0的值,其他类推。
这两种定义方式的区别,主要在小头字节序的CPU上有差别,小头的话,实际内存空间里两种定义方法两字节的位置反一反。

uint16_t 是16位无符号数,uint8_t看起来是8位无符号数,这样的话第二种定义是错误的,一共就8位,不能定义16个单独的bit,bit0:1意思是,起始位bit0,占用1位,bit0:3意思是起始位bit0,占用bit0,bit1,bit2共3位


C语言的结构体位定义问题
bit0:1这句话定义了一个位域,bit0是该位域的域名,而且bit0只占用一个位。位域是指信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位。为了节省存储空间,并使处理简便,C语言提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为...

体位的网络解释体位的网络解释是什么
体位的网络解释是:体位体位是指针灸治疗时身体应处的位置。分坐位、卧位和立位三种,其中以坐位与卧位常用,立位易引起晕针。在临床上是指病患在病床上的身体姿势或检查时所保持的身体姿势。注音是:ㄊ一ˇㄨㄟ_。拼音是:tǐwèi。词性是:名词。结构是:体(左右结构)位(左右结构)。体位的具体解释...

身体语言在沟通中的重要性体现在哪些方面
4. 躲避身体接触:退缩体位或将身体拉远,避免与对方过于亲密的接触,可能暗示不愿意亲近或与对方保持距离。5. 不自在的手势:例如频繁摩挲手指、扭动手腕等,可能显示紧张、压力或不确定。6. 翻白眼或耸肩:表现出对对方的不屑或轻视,可能以翻白眼、耸肩的方式来表达轻蔑的情绪。7. 心神不定的动作:...

一位瑜伽老师教学风格
所以从声音能反映出一个人的健康状况来,想拥有好声音的前提也便是把身体保养好,这是一方面,另一方面呢是需要我们多多去练习的,瑜伽的声音很需要有瑜伽感觉的,因为课程上大部分的动作使用语言来引导的,语调、语速、语言结构、声音大小都是要下功夫来练习的。要做到语言尽量准确精练,让学员在闭着眼睛...

语言中“个”“位”“名”的区别?
个位 - 井位 - 低水位 - 体位 - 借位 - 列位 - 到位 - 单位 - 即位 - 变位 - 各位 - 同位素 - 吨位 - 品位 - 哨位 - 哪位 - 在位 - 地位 - 复位 - 多方位 - 失位 - 学位 - 定位 - 对位 - 就位 - 尸位 - 尸位素餐 - 居位 - 岗位 - 席位 - 座位 - 异位 - 摄位 ...

如何成为优秀的瑜伽老师
所以从声音能反映出一个人的健康状况来,想拥有好声音的前提也便是把身体保养好,这是一方面,另一方面呢是需要我们多多去练习的,瑜伽的声音很需要有瑜伽感觉的,因为课程上大部分的动作使用语言来引导的,语调、语速、语言结构、声音大小都是要下功夫来练习的。要做到语言尽量准确精练,让学员在闭着眼睛...

说课时是不是要声音洪亮,有激情
所以说课内容要求做到有序,而且条理清楚、意思联贯、逻辑严密、结构合理、流畅自然、环环紧扣,以便为实现说课过程的全程优化,提供切实的保证。语言的要求 说课应当以讲述语言为主,再综合运用课堂教学语言和朗读语言。如:在说教学程序设计的时候,由于说的是怎样教,为了让听者听清楚课堂教学是怎样一步一...

结构造句-用结构造句
二十二、街舞跳街舞使人注意力集中,舞蹈动作优美而随意同时,跳街舞可以通过消耗全身脂艾杨格瑜伽非常注重人体的正确的摆放生理 结构 ,骨胳肌肉的功能等,强调体位动作的,我们就不能不佩服这个利用的精妙因为,郭蕾老师为这节课设计的教学目标主要就是揣摩关键词句人物的语言动作神态描写在塑造人物形象中的表达效果这也正是...

谁能给我攻受解释大全啊?
在原始定义中,“攻(seme)”属于主动方,“受(uke)”属于被动方,但随着BL系作品的不断壮大,这一划分标准已经不能满足需要(见下面的“攻受类型解释”)。如今对BL系作品中“攻受”关系比较普遍的说法是:“攻”为1,“受”为0。随着BL文化的深入推广,也有人会将这一概念用到现实中的BL关系中。受的发音在日文和...

面试过程中如何做到不卑不亢、条理清晰?
但是面试的时候就是说不出口,组织不了语言。其实,这个还是由于自身专业语言的欠缺。就好像上学时候为了写好作文需要背诵大量的好词好句一样,为了在面试的时候能够将一些专业术语脱口而出,就需要大家备考时挑选一些典型的题型去反复背诵,比如说护理措施型题,关于环境、体位、病情观察等 ...

金凤区17671909981: C语言的结构体位定义问题 -
阮苛阿法: 按照名字定义,u无符号 int 整形,数字 8 16,表示多少位的整形, 1字节 uint8_t 2字节 uint16_t 4字节 uint32_t 8字节 uint64_t 详情参考:http://www.cnblogs.com/baochun968/archive/2011/10/19/2218008.htmlbit0:1这句话定义了一个位域,bit0...

金凤区17671909981: C语言中,定义结构体问题 -
阮苛阿法: 定义了glass是大小为2的数组,里面的元素是CLS类型的结构体.结构体里面有a, b, c, d四个域.其中a占了10位, b是1位, c是10位, d是1位..

金凤区17671909981: C语言关于结构体定义的问题 -
阮苛阿法: 我见过这样的题,没看懂你的意思,不过我看这样说吧,struct a {...}B; 我打...的地方表示你可以在那里添加所有的数据形式的定义,比如,int a;char a[10];等等;而B表示变量名.就如同int a的a一样,只是一个变量标示符,他就是一个...

金凤区17671909981: C语言结构体位域问题 -
阮苛阿法: 因为你是用int定义的,而int是有符号的,所以初始时a的符号位是1,这样就可以解释你的奇数输入为什么会输出 -1 了,如果你把 int 改成 unsigned 就不会出现这样情况了,一般的都不用 int

金凤区17671909981: C语言结构体定义问题 -
阮苛阿法: typedef struct student *stu; //定义struct student *为stu.以后可以使用stu表示结构体指针类型.y = (stu)malloc(sizeof(stu)); //首先,这里的y应该是结构体指针,定义如struct student *y; 或者直接stu y;(因为上面的定义) 其次,这个定义不...

金凤区17671909981: c语言中定义结构体有哪些方法? -
阮苛阿法: 1.结构体类型数据的定义方法和引用方法 定义结构体:struct 结构体名 { 成员列表 }; 定义结构体类型的变量:有三种形式 ① 定义类型时定义变量:struct 结构体类型名 { 成员列表 }变量名列表; ② 直接定义结构类型变量:struct { 成员列表 }变量...

金凤区17671909981: C语言 结构体定义 -
阮苛阿法: 这题目与结构体根本无关嘛! inline关键字表示函数是内联函数,也就是把调用函数的语句替换成函数体;u32 base; u32是数据类型,相当于unsigned int.这句话就是定义一个u32类型的变量base; KSEG0ADDR:应该是一个宏定义,一般来说宏定义才会全部用大写.

金凤区17671909981: C语言中如何将16位结构体定义为4位和12位两部分 -
阮苛阿法: 1、可以通过位域来实现,如下:struct int_16 { unsigned a : 4; //占4位的部分变量名为a unsigned b : 12; //占12位的部分变量名为b } ;2、在c语言中定义bit型变量,可以使用位域来自定义.位域的定义和位域变量的说明位域定义与结构定义相...

金凤区17671909981: 哪位大侠能够给我讲解一下C语言的结构体定义和调用!~!!!! -
阮苛阿法: 结构体就是把一些属性定义放在一起定义,如:typedef struct A { int c; int b; ...}; 这样如果在程序中使用c就可以用A来定义一个变量如 A a,这样a就有了c,b的属性(好像说属性不太专业~~).想调用就可以在程序中使用a.c了,如a.c = 3;

金凤区17671909981: C语言 结构体定义语句 -
阮苛阿法: 选项A中的a是不是指ord类型的结构体变量,是的,这里,是先定义一个结构体,再定义他的一个变量 a.C 选项,紧接着结构体( 在 } 后)可以直接定义变量.D 选项,无名结构体,C/C++是允许的.无名结构体只能紧接着结构体( 在 } 后)可以直接定义变量.由于是无名的,在这(结构体 } 后面的 ;)之后,就无法再定义这个结构体变量了.记住,C/C++ 的语句是以分号(西文)结束的.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网