c++位字段相关初始化问题 #include struct torgle_register unsigned{ unsigned int sn :4;

C++程序设计浅尝(43)
C程序设计浅尝(17)
C、C++内置的类型分两种,一种是基本数据类型,一种是复合数据类型,此处我们要讲的结构体便是复合数据类型。
先来讨论一下结构体存在的意义吧,也许你认为基本的数据类型就够了,为什么还要有结构题这种复合数据类型存在呢?其实结构体是很有用的。
比如当我们要存储以为老师的基本信息时,则可能需要存储他的姓名、身高、工资、体重、家庭住址等等。我们希望有一种数据格式可以将所有这些信息存储在一个单元中。数组肯定是不能完成这项艰巨的任务的,因为数组虽然可以存储多个元素,但所有元素的类型必须相同,比如,一个数组可以存储20个int类型的元素,另外一个数组可以存储20个double型的元素,但是我们是不能够在一个数组中一部分元素存储20个int,一部分元素用来存储20个double。这也就是数组相对于结构体的缺陷。
C++中的结构体便可以满足存储一位老师基本信息的要需求。结构体是一种币数组更灵活的数据格式,因为同一个结构体可以存储多种类型的数据,这使得我们可以将老师的基本信息存放在一个结构体中从而将数据的表示合并到一起。结构体其实也是C++面向对象的一个基础。
结构体是用户自己定义的类型,定义了这种类型之后,便可以创建结构体变量了(此处也许说成是对象,对理解OOP的帮助更大)。
使用结构体的两个步骤:
定义结构体
创建结构体变量
下面我们创建一个描述一个结构体:
struct 是创建结构体的关键字,表明下面将创建的是一个结构体,worker是结构体的名字,此时我们便可以像创建int类型的变量那样创建结构体变量了。
如果大家对C语言还有映像的话,可能会注意到,此处我创建的两个worker类型的对象时,没有加关键字struct,这里便是C++做的一点改进,这样让我们创建结构体对象时和创建类的对象更加相似了。(注意:C语言创建结构体对象不能省略struct关键字)。
结构体成员的访问是使用“.”成员运算符来实现的,例如此处,我们可以这样访问结构体成员,tom.name,Bob.salary。(tom是一个结构体对象,而tom.name是一个char类型的变量,注意这点区别)。值得一说的是,访问类成员函数如cin.get()的方法是从访问结构体变量的方法衍生而来的。(学语言其实可以学一下语言的发展史)。
4.下面来举一个结构体使用的实例吧
代码如下:
// struct.cpp : 定义控制台应用程序的入口点。
#include &stdafx.h&
#include&iostream&
struct worker
char name[20];
int _tmain(int argc, _TCHAR* argv[])
worker wor1 =
worker wor2 = { &womenBob&, 30 };
cout && &The first worker's name: &
&& wor1.name
&& wor1.age
cout && &The second worker's name: & && wor2.name && & age: & && wor2.age &&
cout &&&sum of age:&&& wor1.age + wor2.age &&
system(&pause&);
运行截图如下:
5.结构体的声明可以放在两个位置:
放在main()函数的前面,此时叫外部声明,可以被其后面的所有函数使用。
放在main()函数中,此时只能被该声明所属的函数使用。
通常还是使用外部声明,这样所有的函数都可以使用这种类型的结构体。
6.结构体的初始化
C++11做了很大的改进,跟数组一样,结构体变量也可以使用花括号“{}”来初始化。
Worker &wor1{“tom”,28};当然也可以加上等号,这样写Worker &wor1={“tom”,28};
不过我相信大家肯定是最喜欢偷懒的写法吧。
注意:如果花括号内没有包含任何东西,那么各个成员都将被设置为0。
Wor1.age的值被设置为0,而wor1.name的每个字节都被设置为0。
7.可能学的深入的朋友还有一个疑问,string类可以作为结构体的成员吗?
当然答案是yes
例如你可以像下面这样定义结构体。
//此处你也可以先指出命名空间。
8.下面再讲一讲结构体的值传递。
大家可能都知道基本数据类型之间的赋值,例如:
这样b的值也就是10了,很是方便,但是结构体可以这样赋值吗,例如可以将bob的值赋给tom吗?tom=bob。
下面举个例子:
代码如下:
// struct.cpp : 定义控制台应用程序的入口点。
#include &stdafx.h&
#include&iostream&
struct worker
char name[20];
int _tmain(int argc, _TCHAR* argv[])
worker wor1 =
worker wor2;
cout && &The first worker's name: &
&& wor1.name
&& wor1.age
wor2 = wor1;
cout && &The second worker's name: & && wor2.name && & age: & && wor2.age &&
cout &&&sum of age:&&& wor1.age + wor2.age &&
system(&pause&);
运行截图:
从上面可以看出,结构体对象之间是可以直接赋值的。
9.最后再说一下结构体数组。结构体数组就是元素为结构体变量的数组。
创建方法和创建基本类型的数组方法一模一样。
例如要创建一个包含50个worker的数组,可以这样:
Worker &wor[50];
Wor是一个worker数组,其中每个元素都是worker对象,可以和成员运算符一起使用。
Cin&&wor[0].name;
Cout&&wor[0].name;
注意:wor是一个数组,而不是结构体。
结构体数组初始化方法:
worker wor[2]={{“tom”,20},{“bob”,30}};
下面举个例子:
代码如下:
// struct.cpp : 定义控制台应用程序的入口点。
#include &stdafx.h&
#include&iostream&
struct worker
char name[20];
int _tmain(int argc, _TCHAR* argv[])
worker wor[2]=
{&tom&,20},
{&bob&,30}
cout && &The first worker's name: &
&& wor[0].name
&& & age: &
&& wor[0].age
cout && &The second worker's name: & && wor[1].name && & age: & && wor[1].age &&
cout &&&sum of age:&&& wor[0].age + wor[1].age &&
system(&pause&);
运行截图如下:
10.最最后再说一下结构体中的位字段。
与C语言一样,C++允许指定占用特定位数的结构体成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便,学硬件的朋友可能深有体会。
下面举个例子:
Struct torgle_register
unsigned int SN :
unsigned int
bool goodIn
bool goodTorgle
位字段通常用在底层的编程中。
好了,关于结构体的知识大概就说到这里了。
注:程序中给出的代码都在VS2013中通过编译运行。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:146128次
积分:4016
积分:4016
排名:第5720名
原创:209篇
转载:44篇
评论:155条
文章:24篇
阅读:20330
阅读:4572
文章:21篇
阅读:11248
(16)(12)(10)(19)(24)(34)(32)(30)(11)(26)(11)(9)(5)(13)(2)(1)C++ 位字段的的问题_百度知道C++&Primer&Plus&第四章学习
1.只有在定义数组时才能使用初始化,如:int
card[3] = {0,1,2};也不能将一个数组赋给另一个数组。;
2.拼接字符串常量,即将两个用引号括起的字符串合并为一个。
3.strlen()函数返回是存储在数组中的字符串的长度,不包含空字符。
4.getline()函数读取整行,它使用通过回车键输入的换行符来确定输入结尾。getline()读取一行输入后,直到到达换行符,随后丢弃换行符。调用方法:cin.getline(name,20);
5.get()也是面向行的输入,但是它不再丢弃换行符,而是将其留在输入队列中。调用如下:
cin.get(name,Arsize).get();
类位于名称空间std中。
7.头文件cstring提供strcpy和strcat函数。函数strcpy()将字符串复制到字符数组中,函数strcat()将字符串附加到字符数组末尾:strcpy(charr1,charr2);
//copy charr2 to charr1
。strcat(charr1,charr2); //append contents of charr2 to
8.获取string字符串字符数:str1.size();&
获取字符串数组字符数:strlen(charr1);
9.将一行输入读取到数组中:cin.getline(charr,20)【char
charr[20]】;将一行输入读取到string对象中:getline(cin,str)【string
10.原始字符串将”(和)”用作定界符,并使用前缀R来标识原始字符串:cout&&R”(Jim
“king” use “\n” instead of endl.)” &&
‘\n’;显示内如如下:Jim
“King” use \n instead of endl。
11.原始字符串如果要包含)”,可以使用”+*(和)+*”替代默认定界符”(和”)。
12.结构定义:struct
inflatable{char name[20];};
&结构初始化:inflatable
duck = {“Daphne”, 0,12,& 9.98};
13.结构数组初始化:inflatable
guest[2] ={
&{“Bambi”,
0.5, 21.99},
&{“Godzilla”,
14.结构中的位字段:struct
int SN : 4;&
//4bits for SN value
Bool goodIn
1;& //valid
input (1bit)
能够存储不同的数据类型,但只能同时存储其中的一种类型。公用体每次只能存储一个值,共用体的长度为其最大成员的长度。union
long long_
double double_
16.枚举指定的值必须时整数:enum
bits{one = 1, Two = 2, four = 4, eight = 8};
这强调*ptr是一个int类型的值。int*
这强调int*是一种类型——指向int的指针。
18.一定要在对指针应用解除引用运算符(*)之前,将指针初始化为一个确定的、适当的地址。
19.正常的变量值都存储在被称为栈(stack)的内存区域中,而new从被称为堆(heap)或自由存储区(free
store)的存储区域分配内存。
20.不要尝试释放已经释放的内存块,这样做的结果是不确定的。
21.new与delete的用法:int
* ps =&&&&&&&
Int * posome = new int[10];&&&&&&&&&&&&&
22.数组名被解释为其第一个元素的地址,而对数组名应用地址运算符时,得到的是整个数组的地址。如:short
tell[10]; tell是一个short指针(*
short),而&tell是这样一个指针,即指向包含20个元素的short数组(short(*)[20])。
23.使用数组声明来创建数组时,将采用静态联编,即数组的长度在编译时设置;使用new[]运算符创建数组时,将采用动态联编(动态数组),即将在运行时为数组分配空间,其长度也将在运行时设置。
24.在cout和多数C++表达式中,char数组名、char指针以及用引号括起来的字符串常量都被解释为字符串第一个字符的地址。
25.箭头成员运算符(-&),该运算符可用于指向结构的指针,就像点运算符可用于结构名一样。
26.函数内部定义的常规变量使用自动存储空间,被称为自动变量。自动变量的作用域为包含它的代码块,自动变量通常存储在栈中,在执行代码块时存在,离开代码块时释放。
27.静态存储是整个程序执行期间都存在的存储方式,使变量成为静态的方式有两种:一种是在函数外面定义它,另一种是在声明变量时使用关键字static。
28.动态存储:new和delete运算符管理了一个内存池,被称为自由存储空间(free
store)或堆(heap),与栈中自动添加和删除机制使得占用的内存总是连续的不同,占用的自由存储区可能不连续。
29.模板类vector是一种动态数组,包含在名称空间std中。要使用vector对象,必须包含头文件vector。
30.创建一个名为vt的vector对象,它可存储n_elem个类型为typeName的元素:
vectorvt(n_elem);
其中参数n_elem可以是整型常量,也可以是整型变量。
31.模板类array:位于名称空间std中,要创建array对象需要包含头文件array。
32.array对象的长度是固定的,使用栈(静态内存分配),而不是自由存储区。
创建一个名为arr的对象,它包含n_elem个类型为typeName的元素:
与vector对象不同的是,n_elem不能是变量。
33.vector a2(4);
a2.at(1) = 2.3;&&
//assign 2.3 to a2[1]
使用at()时,将在运行期间捕获非法索引,而程序默认将中断。
34.标准头文件cstring(老式实现为string.h)提供了函数strlen()以及很多与字符串相关的其他函数声明。
35.不管float、int、char、double类型的指针,指针都占用了4个字节。因为我们的芯片寻址方式是32位,指针其实就是地址,既指针是4个字节的。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。结构中的位字段是什么意思???
C++书上在&结构体的后面有介绍&结构体中的位字段&没看懂什么意思???高手解答
struct&torgle_register
&&&unsigned&int&SN:4;
&&&unsigned&int&:4;
&&&bool&goodIn&:1;
&&&bool&goodTorgle:1;
参考c语言中的位域
只使用部分二进制位来表示一个变量,节省空间
位域&大概在哪里有介绍?
google&“位域”
上网搜下“结构体中的位域”
引用&1&楼&justkk&的回复:参考c语言中的位域
只使用部分二进制位来表示一个变量,节省空间
有些信息在存储时,并不需要占用一个完整的字节,&而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1&两种状态,&用一位二进位即可。为了节省存储空间,并使处理简便,C语言又提供了一种数据结构,称为“位域”或“位段”。所谓“位域”是把一个字节中的二进位划分为几个不同的区域,&并说明每个区域的位数。每个域有一个域名,允许在程序中按域名进行操作。&这样就可以把几个不同的对象用一个字节的二进制位域来表示。一、位域的定义和位域变量的说明位域定义与结构定义相仿,其形式为:&
struct&位域结构名&
{&位域列表&};
其中位域列表的形式为:&类型说明符&位域名:位域长度&
};位域变量的说明与结构变量说明的方式相同。&可采用先定义后说明,同时定义说明或者直接说明这三种方式。例如:&
}说明data为bs变量,共占两个字节。其中位域a占8位,位域b占2位,位域c占6位。对于位域的定义尚有以下几点说明:
1.&一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。例如:&
unsigned&a:4
unsigned&:0&/*空域*/
unsigned&b:4&/*从下一单元开始存放*/
unsigned&c:4
在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。
2.&由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。
3.&位域可以无位域名,这时它只用来作填充或调整位置。无名的位域是不能使用的。例如:&
int&:2&/*该2位不能使用*/
};从以上分析可以看出,位域在本质上就是一种结构类型,&不过其成员是按二进位分配的。
二、位域的使用位域的使用和结构成员的使用相同,其一般形式为:&位域变量名·位域名&位域允许用各种格式输出。
unsigned&a:1;
unsigned&b:3;
unsigned&c:4;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit-&a=0;
pbit-&b&=3;
pbit-&c|=1;
printf("%d,%d,%d\n",pbit-&a,pbit-&b,pbit-&c);
}&上例程序中定义了位域结构bs,三个位域为a,b,c。说明了bs类型的变量bit和指向bs类型的指针变量pbit。这表示位域也是可以使用指针的。
程序的9、10、11三行分别给三个位域赋值。(&应注意赋值不能超过该位域的允许范围)程序第12行以整型量格式输出三个域的内容。第13行把位域变量bit的地址送给指针变量pbit。第14行用指针方式给位域a重新赋值,赋为0。第15行使用了复合的位运算符"&=",&该行相当于:&pbit-&b=pbit-&b&3位域b中原有值为7,与3作按位与运算的结果为3(111&011=011,十进制值为3)。同样,程序第16行中使用了复合位运算"|=",&相当于:&pbit-&c=pbit-&c|1其结果为15。程序第17行用指针方式输出了这三个域的值。
回复
即使是一小步也想与你分享1、结构(struct)简介
假如需要存储一个篮球运动员的信息,那么可能需要存储他的姓名、工资、身高、体重、平均得分、命中率、助攻次数等信息。这些数据的格式各不相同,像姓名是字符串类型,身高和体重是整型,为了将这一个运动员作为一个整体把他的所有信息打包在一块,结构体就是应这个需求产生的。(数组是无法满足上例要求的,数组虽然可以存储多个元素,但是每个数组的元素类型必须是相同的)
C++中的结构体可以满足要求(存储篮球运动员的信息)。结构是一种比数组更加灵活的数据格式,因为同一个结构中可以存储多种类型的数据,这使得可以将有关篮球运动员的信息放在一个结构中,从而使数据的表示合并在一起。如果要跟踪整个球队,则可以使用结构数组。类的设计正是在结构体的基础上建立起来的。
结构是用户自己定义的类型,用户可以用自己定义的这个结构体类型声明一个数据的属性。定义了类型之后就可以创建这个类型的变量。因此,创建结构体包括两步。首先,定义结构描述---描述并标记了能够存储在结构中的各种数据类型。然后,按描述创建结构变量(结构数据对象)。感觉抽象看下面的例子:
例如,假设Bloataire公司要创建一种类型来描述其生产线上充气产品的成员。具体点说,这种类型应该存储产品名称、容量和售价。下面就是创建结构体的过程:
struct inflatable
char &name[20];
上面这段代码创建的就是一个结构体。关键字struct就表明这是一个结构体。标识符inflatable是这种数据格式的名称,因此新类型的名称为inflatable(类似于整型名称是int,以后就可以直接用这个名称来声明变量了,如inflatable &a;)。接下来的大括号中包含的是结构存储的数据类型的列表,其中每个列表项都是一条声明语句。因此,inflatable结构中有3个成员。
在定义了结构体之后,就可以像使用int或char那样使用结构体创建变量了:
inflatable &
这里与C语言有些区别,C语言中要求声明时必须带着struct,但是C++允许在声明结构变量时省略关键字struct。
struct inflatable & & & //C语言中带着struct
inflatable & & & & & & //C++中可以不带struct
对于类型为结构体的变量,可以使用成员运算符(.)来访问各个成员。例如,上面例子中就可以这么访问vincent.volume指的是结构中的volume成员,vincent.price指的是price成员。因为price成员声明的是double类型,因此,vincent.price相当于double类型的变量,可以跟以前使用变量时一样使用就行了。
下面我们通过一个程序来了解一下结构体的具体用法:
#include &iostream&
struct inflatable & & & //声明一个结构体类型
char & name[20];
int &main()
using &namespace &
inflatable & guest =
&Glorious &Gloria&, & &//姓名值
1.88, & & & & & & & & & & //volume 值
29.99 & & & & & & & & & & &//price值
}; & & & & & & & & &//guest是一个inflatable类型的变量
//这是结构体初始化的一种方式
inflatable & &pal &=
&Audacious &Arthur&,
cout && &Expand &your &guest & list & with&&&guest.
cout && & &and &&&&pal.name && &!\n&;
cout && & &You &can &have &both &for &$&;
cout && guest.price + pal.price && & !\n&
& return 0;
程序输出:Expand your guest &list with Glorious &Gloria &and &Audacious &Arthur !
You can have both for &$62.98!
上面程序需要说明的地方:
结构声明的位置很重要。可以有两种声明位置:一种是可以将声明放在main()函数中,紧跟在开始括号的后面。另一种是将声明放在main()函数的前面,这里采用的就是这种方式,位于函数外面的声明称为外部声明。对于只有一个主函数的程序来说放在外面和里面没有区别,但是如果有多个函数,外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。所以对于结构体通常应使用外部声明,这样所有的函数都可以使用这种类型的结构。
变量也同样可以在函数内部和外部定义,外部变量由所有的函数共享。但是C++不提倡使用外部变量,但提倡使用外部结构声明。另外,符号常量也一般在外部声明。
还需要注意上面初始化结构体的方式。也可以只用逗号隔开。如inflatable &duck &= { &Daphne&, 0.12 &, 9.98};
2、结构体的一些属性
C++尽量使用户自定义的的类型和内置类型相似。比如,可以将结构体作为参数传递给函数,可以让函数返回一个结构体,另外,还可以使用赋值运算符(=)将结构赋给另一个同类型的结构,这样结构中的每一个成员都将被设置成另一个结构中相应成员的值,即使成员是数组。这种赋值被称为成员赋值。
下面的例子介绍了结构赋值:
#include &iostream&
struct &inflatable
char &name[20];
int main()
using namespace &
inflatable &bouquet &=&
&sunflowers&,
infilatable &
cout && &bouquet: &&&bouquet.name && & for $&;
cout && bouquet.price &&
choice = & & & & & & //直接结构体赋值
cout && &choice: &&& choice.name && & &for $&;
cout && choice.price &&
return &0;
程序输出:
bouquet: sunflowers for $12.49
choice: &sunflowers &for &$12.49
结构体的第二个属性是可以同时完成定义结构和创建结构变量的工作。只需将变量名放在结束括号的后面即可:
struct &perks
char &car[12];
} mr_smith, &ms_ & & & & &//两个perks类型的结构变量
3、结构数组
可以创建元素为结构的数组,方法和创建基本类型的数组完全相同。例如:创建一个包含100个inflatable结构的数组 & inflatable &gifts[100];
这样,gifts将是一个inflatable数组,其中每一个元素(如gifts[0]或gifts[99])都是inflatable对象,可以与成员运算符一起使用:
cin&&gifts[0].
但是注意,gifts本身是一个数组,而不是结构,因此像gifts.price这样的表述是无效的。
初始化结构数组,可以按照如下格式:
inflatable &guests[2] &=
{&Bambi&, 0.5 ,21.99},
{&Godzilla&, &}
4、结构体中的位字段
与C语言一样,C++也允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,它指定了使用的位数。可以使用没有名称的字段来提供间距。每个成员都被称为位字段。
struct &torgle_register
unsigned &int &SN : 4;
unsigned int &: &4;
bool &goodIn &: &1;
bool &goodTorgle &: & 1;
可以像通常那样初始化这些字段,还可以使用标准结构表示法来访问位字段:
torgle_register &tr &= { &14, true &,false };
if( tr.goodIn)
位字段通常用在低级编程中。一般来说,可以使用整型或按位运算符代替这种方式。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:6033次
排名:千里之外
原创:35篇
(1)(11)(22)(1)

我要回帖

更多关于 mysql unsigned 的文章

 

随机推荐