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

每天一点C++(之三)
每天一点C++(之三)
之前的一天因为有科目考试,所以暂停了一天的基础积累。这些每天一点C++只是我自己在看回基础书籍的时候感觉C++11中有点特别的新特性,还有自己之前没有注意到的细节的积累。(PS:我只是一个菜鸟,但是,我决定要坚持积累。希望我能够有变成大神的那一天。hoho!!)
正常的编译器是不会检查数组使用的下标是否有效,因此假如下标的值大于数组长度的话,编译运行是没有错误的。但是在运行过程中,可能会破坏数据或代码。也可能导致程序异常终止。这种错误如果发生在大型程序中也会让我们难以找出错误所在吧!(PS:sizeof运算符用在数组名上得出的是数组中的字节数哦!)
C++11中数组的初始化有几点改变,其中禁止缩窄转换是我觉得应该注意的地方,也就是说,在数组初始化的时候列表中不能出现浮点数转换成整形,也不能出现超出变量取值范围的情况。
结构体(struct)、共用体(union)、枚举(enum)
C++中的结构体,其实就是一种数据格式,将各种数据类型包含在一起来储存数据。而C++的结构体中还可以包含成员函数(C中是不允许的哦),但是这样一来结构体便和类差不多了。(其中的一些处理机制还是不一样的,但是,何必为此而创建一个类似于类的结构体呢?)
在基础书籍中有提到一个叫结构中的位字段,与C语言一样,C++允许指定占用特定位数的结构成员,使得创建与某个硬件设备上的寄存器对应的数据结构方便许多。其中,字段的类型应该为整形或枚举型,加上冒号,后再加上一个指定使用的位数的数字。例子:
struct torgle_register
unsigned int SN : 4;
unsigned int : 4;
共用体,顾名思义就是说能够使得自己被用作其他的类型,可以轻易储存不同的数据类型,但是要记住的是,只能同时储存其中的一种类型。因为每次只能储存一个值,那么当然只能够以最大的成员长度为自身长度了。共用体可以匿名使用,如在结构体中定义匿名共用体,在调用时,就是指当前的成员。
共用体常用于节省内存,但是相对于今天的GB级系统内存来说,一般没有必要,而对于嵌入式的系统来说就不是了。最后说明一下,共用体常用于操作系统数据结构或硬件数据结构。
在我眼中的枚举其实就是一连串的数字被定义为用符号表示,而程序中,枚举类型都常被用来定义相关的符号常量,而非新类型。在枚举类型中,一般是第一个的值为0,但是也可以认为地赋初始值它,其后没有被赋值的就会被赋值为(前一变量的值+1).而在不强制类型转换的情况下,只能将定义枚举时使用的枚举量赋值给同种枚举类型的变量。枚举类型,只定义了赋值运算符。而枚举类型能够被提升为int类型,反过来的自动转换却是不行的。
阅读(...) 评论()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++】学习笔记七——结构 - CSDN博客
【C++】学习笔记七——结构
假如要存储有关篮球运动员的信息,则可能需要存储他的姓名、身高、体重、平均得分、命中率、助攻次数等。希望有一种数据格式可以将所有这些信息存储在一个单元中。用数组无法完成这项任务,因为数组虽然可以存储多个元素,但所有元素必须类型相同,也就是说,不能在同一个数组中既存储int,又存储float。
C++中的结构可以满足要求。结构是一种比数组更加灵活的数据格式,同一个结构可以存储多种类型的数据。
结构是用户定义的类型,结构声明定义了这种类型的数据属性。
创建结构包括两步:
定义结构描述:描述并标记能够存储在结构中的各种数据类型;
按描述创建结构变量(结构数据对象)。
假设某公司要创建一种类型来描述某种充气产品(书上举得什么例子……),这种类型应存储产品名称、容量、售价,下面的结构描述能够满足这些要求:
struct inflatable
char name[20];
关键字struct表明这些代码定义的是一个结构,inflatable是这种数据格式的名称,因此新类型的名称为inflatable。这样便可以像创建char、int类型的变量那样创建inflatable类型的变量。
大括号中包含的是结构存吃的数据类型的列表,其中每个列表项都是一条声明语句。列表中的每一项都被称为结构成员。总之,结构定义指出了新类型(inflatable)的特征。
定义结构后,便可以创建这种类型的变量了:
inflatable woopie_
与C语言不同的是,C++允许在声明结构变量时省略关键字struct:
在C++中,结构标记的用法与基本类型名相同。这种变化强调的是,结构声明定义了一种新类型。在C++中,省略struct不会出错。
由于hat类型为inflatable,因此可以使用成员运算符(.)来访问各个成员。例如:hat.volume指的是结构的volume成员,hat.price指的是price成员。同样,vincent.price是vincent变量的price成员。总之,通过成员名能够访问结构的成员,就像通过索引能够访问数组的元素一样。由于price成员被声明为double类型,因此,hat.price和vincent.price相当于是double类型的变量,可以向使用常规double变量那样来使用他们。总之,hat是一个结构,hat.price是一个double变量。
访问类成员函数(如cin.get())的方式是从访问结构成员变量(如hat.price)的方式衍生出来的。
1. 在程序中使用结构
#include&iostream&
struct inflatable
char name[20];
int main()
using namespace std;
inflatable guest =
"Glorious Gloria",
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";
cin.get();
结构声明的位置很重要,程序4.11有两种选择:可以将声明放在main()函数中,紧跟在{后,这种声明称为内部声明;也可以将声明放在main()函数前(如4.11所示),这种声明被称为外部声明。
对于包含两个或者更多函数的程序来说,外部声明可以被其后面的任何函数使用,而内部声明只能被该声明所属的函数使用。通常应使用外部声明,这样所有的函数都可使用这种类型的结构。
变量也可以在函数内部和外部定义,外部变量由所有的函数共享。C++不提倡使用外部变量,但提倡使用外部结构声明。另外,在外部声明符号常量通常更合理。
初始化方式:
inflatable guest =
"Glorious Gloria",
和数组一样,使用逗号分隔值列表,并将这些值用{}括起。在这里每个值占一行,但也可以将它们全部放在同一行,只用逗号将他们分开:
inflatable guest ={"Glorious Gloria",1.88,29.99};
可将结构的每个成员都初始化为适当类型的数据。例如,name成员是一个字符数组,因此可以将其初始化为一个字符串。
可将每个结构成员看作是相应类型的变量。因此,pal.price是一个double变量,pal.name是一个char数组。当程序使用cout显示pal.name时,将把改成员显示为字符串。由于pal.name是一个字符数组美因此可以用下标来访问各个字符,例如,pal.name[0]是字符A,不过pal[0]没有意义。
2. C++11结构初始化
与数组一样,C++11也支持将列表初始化用于结构,且=是可选的:
inflatable duck {"Daphne, 0.12, 9.98};
如果大括号内未包含任何东西,各个成员都将被置为零:
inflatable mayor {};
不允许缩窄转换
3. 结构可以将string类作为成员
可以将成员name指定为string对象而不是字符数组:
#include&string&
struct inflatable
std::string
4. 其他结构属性
#include&iostream&
struct inflatable
char name[20];
int main()
using namespace std;
inflatable bouquet =
"sunflowers",
cout && "bouquet: " && bouquet.name && " for $";
cout && bouquet.price &&
cout && "choice: " && choice.name && " fot $";
cout && choice.price &&
cin.get();
程序4.12说明,成员赋值是有效的,因为choice结构的成员值与bouquet结构中存储的值相同。
可以同时完成定义结构和创建结构变量的工作,只需将变量名放在结束括号}的后面即可:
struct perks
char car[12];
} mr_smith, ms_
也可以初始化以这种方式创建的变量:
struct perks
char car[12];
} mr_glitz =
但是,将结构定义和变量声明分开,更易于阅读和理解。
还可以声明没有名称的结构类型,方法是省略名称,同时定义一种结构类型和一个这种类型的变量:
除了C++可以使用结构标记作为类型名称(即省略struct)外,C机构具有上述所有C++(非C++11)结构特性。
5. 结构数组
inflatable结构包含一个数组(name)。也可以创建元素为结构的数组,方法和创建基本类型数组完全相同。例如,要创建一个包含100个inflatable结构的数组,可以:
inflatable gifts[100];
这样,gifts将是一个inflatable数组,其中每个元素(gifts[0]到gifts[99])都是inflatable对象,可以与成员运算符一起使用:
&&[0].volume;
&&[99].price&&;
注意:gifts本身是一个数组,而不是结构,因此像gifts.price这样的表述是无效的。
初始化结构数组可以结合初始化数组的规则和初始化结构的规则:
inflatable guest[2] =
{"Bambi",0.5,21.99},
{"Godzilla",2000,565.99},
#include&iostream&
struct inflatable
char name[20];
int main()
using namespace std;
inflatable guests[2]=
{"Bambi",0.5,21.99},
{"Godzilla",2000,565.99}
cout && "The guests " && guests[0].name && " and " && guests[1].name
&& "\nhave a combined volume of "
&& guests[0].volume + guests[1].volume && " cubic feet.\n";
cin.get();
6. 结构中的位字段
与C语言一样,C++也允许指定占用特定位数的结构成员,这使得创建与某个硬件设备上的寄存器对应的数据结构非常方便。字段的类型应为整型或枚举,接下来是冒号,冒号后面是一个数字,该数字制定了使用的位数。可以使用没有名称的字段来提供间距。每个成员都被称为位字段(bit field)。例如:
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)
位字段通常用在低级编程中。一般来说,可以使用整型和按位运算符来代替这种方式。
本文已收录于以下专栏:
相关文章推荐
函数和结构
  为结构编写函数比为数组编写函数简单得多。在函数中,结构变量的行为更接近于基本的单值变量,与数组不同,结构将其数据组合成单个实体或数据对象,被视为一个整体。
  可以讲一个结构赋给另...
两年前写的,欢迎大家吐槽!
转载请注明出处。
3.静态数据成员
CStatic类具有静态的数据成员,现在来看一下它与上面提到过的类有什么不同:
class CStatic
//偶尔测试用的,不过好像没什么反应。。。
LRESULT CALLBACK Win...
线性表基础知识以及C++实现
什么是队列呢?
是一种先进先出的数据结构
FIFO:first in first out
比如说日常生活中排队,此时的“队”就是队列,先排队的先出...
目录(?)[+]
字节对齐的原因
一些平台对某些特定类型的数据只能从某些特定地址开始存取。比如有些架构的CPU在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编程必须保证字节对齐....
【C++数据结构学习笔记---线性表】带头结点的双向循环链表
一个简单的实现例子,只用到了插入函数以及输出函数,初始化26个英文字母。
插入算法的思路:(insert)本算法为结点后插入
练习基本上是照着源码打的,,主要是各种const想不清楚yu
他的最新文章
讲师:王禹华
讲师:宋宝华
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 struct初始化 的文章

 

随机推荐