sizeof求结构体大小问题详解

sizeof求结构体大小问题详解
sizeof求结构体大小问题详解

sizeof计算含有虚函数的类的空间大小

sizeof计算含有虚函数的类的空间大小 当我们计算一种数据类型所占用的空间大小时,很easy,sizeof就可以解决掉。如果我们计算一个类,一个空类,或者一个含有虚函数然后又派生子类时,这时候他们所占用的内存空间是如何变化的呢?下面我们就通过代码来介绍下。 一个不含有虚函数的普通类与其派生类的内存关系 class Base { public: Base(int x):a(x) {} void print() { cout<

2.对于Derived类 Derived类继承于Base类,自然的继承了其成员变量a,自身又扩展了自己的成员变量b,因而多了4个字节。所以Derived类所占用的内存空间大小应该为8字节。 一个含有虚函数的类与其派生类的内存空间占用关系 class A { public: A(int x):a(x){} virtual void print(){cout<

(完整版)数据结构课后习题及解析第二章

第二章习题 1.描述以下三个概念的区别:头指针,头结点,首元素结点。 2.填空: (1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。 (2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。在单链表中,逻辑上相邻的元素,其物理位置相邻。 (3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。 a. 在P结点后插入S结点的语句序列是:。 b. 在P结点前插入S结点的语句序列是:。 c. 在表首插入S结点的语句序列是:。 d. 在表尾插入S结点的语句序列是:。 供选择的语句有: (1)P->next=S; (2)P->next= P->next->next; (3)P->next= S->next; (4)S->next= P->next; (5)S->next= L; (6)S->next= NULL; (7)Q= P; (8)while(P->next!=Q) P=P->next; (9)while(P->next!=NULL) P=P->next; (10)P= Q; (11)P= L; (12)L= S; (13)L= P; 4.设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 5.写一算法,从顺序表中删除自第i个元素开始的k个元素。 6.已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 7.试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。 (1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。 (2)以单链表作存储结构。 8.假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A 表和B表的)结点空间存放表C。

sizeof()用法汇总

sizeof()功能:计算数据空间的字节数 1.与strlen()比较 strlen()计算字符数组的字符数,以"\0"为结束判断,不计算为'\0'的数组元素。 而sizeof计算数据(包括数组、变量、类型、结构体等)所占内存空间,用字节数表示。 2.指针与静态数组的sizeof操作 指针均可看为变量类型的一种。所有指针变量的sizeof 操作结果均为4。 注意:int *p; sizeof(p)=4; 但sizeof(*p)相当于sizeof(int); 对于静态数组,sizeof可直接计算数组大小; 例:int a[10];char b[]="hello"; sizeof(a)等于4*10=40; sizeof(b)等于6; 注意:数组做型参时,数组名称当作指针使用!! void fun(char p[]) {sizeof(p)等于4} 经典问题: double* (*a)[3][6]; cout<

sizeof详细分析以及陷阱

1、什么是sizeof 首先看一下sizeof在msdn上的定义: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 看到return这个字眼,是不是想到了函数?错了,sizeof不是一个函数,你见过给一个函数传参数,而不加括号的吗?sizeof可以,所以sizeof不是函数。网上有人说sizeof是一元操作符,但是我并不这么认为,因为sizeof更像一个特殊的宏,它是在编译阶段求值的。举个例子: cout<

c语言的sizeof函数

? ? 聚焦 ? 论坛 ? 博客 ? 来吧 ? 问答 ? 游戏 ? 品牌 ? 购物街 ? ? 登录 ? 注册 ? 社区服务 首页 > 提问列表 > 提问 c 中的sizeof 函数放在哪个头文件? [编程 数据库 ] 悬赏点数 10 3个回答 肚兜2569 2009-06-18 13:04:51 172.30.211.* c 中的sizeof 函数放在哪个头文件? 回答 登录并发表 取消 回答 jjvcd3 2009-06-18 13:05:15 59.175.191.* sizeof 是单目运算符,是关键字之一,不是函数,没有头文件 lclcug 2009-06-18 23:00:39 58.242.187.* 1.sizeof 操作符的结果类型是size_t ,它在头文件中typedef 为unsign ed int 类型。该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof 是算符 圣斗士之家 2009-06-19 17:54:42 123.6.3.* SizeOf Pascal 的一种内存容量度量函数: 用法: Var 等您来回答 pe 的桌面文件放在哪个目录下 - 0个回答 魔兽3.0.5版本安装文件怎样放在别的磁盘? - 1个回答 psp 看电影把影片放在哪个文件里? - 1个回答 多普达领航者的历史地址放在哪个文件中 - 1个回答 艾奇mp4转换器转换完的文件会放在哪里 - 1个回答

a : array[1..10000] of longint; Begin Writeln(SizeOf(a)); End. 输出:40000 如果定义Integer,则输出:20000 c语言中判断数据类型长度符 用法 sizeof(类型说明符,数组名或表达式); 或 sizeof 变量名 1. 定义: sizeof是C/C++中的一个操作符(operator)是也,简单的说其作用就是返回一个对象或者类型所占的内存字节数。 MSDN上的解释为: The sizeof keyword gives the amount of storage, in bytes, associated with a variable or a type (including aggregate types). This keyword returns a value of type size_t. 其返回值类型为size_t,在头文件stddef.h中定义。这是一个依赖于编译系统的值,一般定义为 typedef unsigned int size_t; 世上编译器林林总总,但作为一个规范,它们都会保证char、sig ned char和unsigned char的sizeof值为1,毕竟char是我们编程能用的最小数据类型。 2. 语法: sizeof有三种语法形式,如下: 1) sizeof( object ); // sizeof( 对象); 2) sizeof( type_name ); // sizeof( 类型); 3) sizeof object; // sizeof 对象; 所以, int i; sizeof( i ); // ok sizeof i; // ok sizeof( int ); // ok sizeof int; // error 既然写法3可以用写法1代替,为求形式统一以及减少我们大脑的负担,第3种写法,忘掉它吧!实际上,sizeof计算对象的大小也是转换成对对象类型的计算,也就是说,同种类型的不同对象其sizeof 绿坝截屏文件放在哪个目 录 - 2个回答 放在桌面的文件在哪个文件夹 - 5个回答

C语言32个关键字九种控制语句34种运算符

总结归纳了C语言的32个关键字 第一个关键字:auto 用来声明自动变量。可以显式的声明变量为自动变量。只要不是声明在所有函数之前的变量,即使没加auto关键字,也默认为自动变量。并且只在声明它的函数内有效。而且当使用完毕后,它的值会自动还原为最初所赋的值。自动变量使用时要先赋值,因为其中包含的是未知的值。 例:auto int name=1; 第二个关键字:static 用来声明静态变量。可以显式的声明变量为静态变量。也为局部变量。只在声明它的函数内有效。它的生命周期从程序开始起一直到程序结束。而且即使使用完毕后,它的值仍旧不还原。即使没有给静态变量赋值,它也会自动初始化为0. 例:static int name=1. 第三个关键字:extern 用来声明全局变量。同时声明在main函数之前的变量也叫全局变量。它可以在程序的任何地方使用。程序运行期间它是一直存在的。全局变量也会初始化为0. 例:extern int name; 第四个关键字:register 用来声明为寄存器变量。也为局部变量,只在声明它的函数内有效。它是保存在寄存器之中的。速度要快很多。对于需要频繁使用的变量使用它来声明会提高程序运行速度。 例:register int name=1; 第五个关键字:int 用来声明变量的类型。int为整型。注意在16位和32位系统中它的范围是不同的。16位中占用2个字节。32位中占用4个字节。还可以显式的声明为无符号或有符号: unsigned int或signed int .有符号和无符号的区别就是把符号位也当作数字位来存储。也可用short和long来声明为短整型,或长整行。 例:int num; 第六个关键字:float 用来声明变量的类型。float为浮点型,也叫实型。它的范围固定为4个字节。其中6位为小数位。其他为整数位。 例:float name;

C语言中的sizeof的理解

C语言中的sizeof的理解。。 一、sizeof的概念 sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等。它并不是函数。sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。操作数的存储大小由操作数的类型决定。 二、sizeof的使用方法 1、用于数据类型sizeof使用形式:sizeof(type) 数据类型必须用括号括住。如sizeof(int)。 2、用于变量sizeof使用形式:sizeof(var_name)或sizeof var_name 变量名可以不用括号括住。如sizeof(var_name),sizeof var_name等都是正确形式。带括号的用法更普遍,大多数程序员采用这种形式。 注意:sizeof操作符不能用于函数类型,不完全类型或位字段。不完全类型指具有未知存储大小的数据类型,如未知存储大小的数组类型、未知内容的结构或联合类型、void类型等。 如sizeof(max)若此时变量max定义为int max(),sizeof(char_v)若此时char_v定义为char char_v[MAX]且MAX未知,sizeof(void)都不是正确形式。 三、sizeof的结果 sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。 1、若操作数具有类型char、unsigned char或signed char,其结果等于1。 ANSI C正式规定字符类型为1字节。 2、int、unsigned int、short int、unsigned short、long int、unsigned long、float、double、long double类型的sizeof在ANSI C中没有具体规定,大小依赖于实现,一般可能分别为2、2、2、2、4、4、4、8、10。 3、当操作数是指针时,sizeof依赖于编译器。例如Microsoft C/C++7.0中,near类指针字节数为2,far、huge类指针字节数为4。一般Unix的指针字节数为4。 4、当操作数具有数组类型时,其结果是数组的总字节数。 5、共用体类型操作数的sizeof是其最大字节成员的字节数。结构类型操作数的sizeof 是这种类型对象的总字节数。 让我们看如下结构: struct{char b;double x;}a; 在某些机器上sizeof(a)=12,而一般sizeof(char)+sizeof(double)=9。 这是因为编译器在考虑对齐问题时,在结构中插入空位以控制各成员对象的地址对齐。如double类型的结构成员x要放在被4整除的地址。 6、如果操作数是函数中的数组形参或函数类型的形参,sizeof给出其指针的大小。 四、sizeof与其他操作符的关系 sizeof的优先级为2级,比/、%等3级运算符优先级高。它可以与其他操作符一起组成表达式。如i*sizeof(int);其中i为int类型变量。 五、sizeof的主要用途 1、sizeof操作符的一个主要用途是与存储分配和I/O系统那样的例程进行通信。例如: void*malloc(size_t size), size_t fread(void*ptr, size_t size, size_t nmemb, FILE*stream)。 2、sizeof的另一个的主要用途是计算数组中元素的个数。例如: void*memset(void*s, int c, sizeof(s))。

算法设计与分析(详细解析(含源代码)

常用算法设计方法 要使计算机能完成人们预定的工作,首先必须为如何完成预定的工作设计一个算法,然后再根据算法编写程序。计算机程序要对问题的每个对象和处理规则给出正确详尽的描述,其中程序的数据结构和变量用来描述问题的对象,程序结构、函数和语句用来描述问题的算法。算法数据结构是程序的两个重要方面。 算法是问题求解过程的精确描述,一个算法由有限条可完全机械地执行的、有确定结果的指令组成。指令正确地描述了要完成的任务和它们被执行的顺序。计算机按算法指令所描述的顺序执行算法的指令能在有限的步骤内终止,或终止于给出问题的解,或终止于指出问题对此输入数据无解。 通常求解一个问题可能会有多种算法可供选择,选择的主要标准是算法的正确性和可靠性,简单性和易理解性。其次是算法所需要的存储空间少和执行更快等。 算法设计是一件非常困难的工作,经常采用的算法设计技术主要有迭代法、穷举搜索法、递推法、贪婪法、回溯法、分治法、动态规划法等等。另外,为了更简洁的形式设计和藐视算法,在算法设计时又常常采用递归技术,用递归描述算法。 一、迭代法 迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行: (1)选一个方程的近似根,赋给变量x0; (2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0; (3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。 若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。上述算法用C程序的形式表示为: 【算法】迭代法求方程的根 { x0=初始近似根; do { x1=x0; x0=g(x1);/*按特定的方程计算新的近似根*/ } while ( fabs(x0-x1)>Epsilon);

C语言二级考前一个月复习概况

整数的三种表示形式 表示形式 组成 开头部分 十进制 D,或不加表示 0-9 以1-9开头 八进制 O 0-7 以0开头 十六进制 H 0-9,A-F 以0x 开头 int a[100],*p; 等价语句 p=a; P=&a[0]; 等价语句 p=a+1; P=&a[1]; 文本文件 二进制文件 使用方式 含义 使用方式 含义 r 打开文本文件进 行只读 rb 打开二进制文件进行只读 w 建立新的文本文件进行只写 wb 建立二进制文件进行只写 a 打开文本文件进 行追加 ab 打开二进制文件进行追加/写 R+ 打开文本文件进 行读/写 Rb+ 打开二进制文件进行读/写 W+ 建立新的文本文件进行读/写 Wb+ 建立二进制文件进行读/写 A+ 打开文本文件进行读/写/追加 Ab+ 打开二进制文件进行读/写/追加

指针是以地址作为其值的变量,数组名的值是一个特殊的固定地址,可以作为常量指针。 类型 名称 类型名 数据长度 整型 整型 Int 32位 短整型 Short int 16位 长整型 Long int 32位 字符型 字符型 Char 8位 实型(浮点型) 单精度浮点型 float 32位 双精度浮点型 double 64位 函数 数据类型 格式 printf float %f double %e scanf float %f %e double %lf %le 字符串的输入和输出 输入 Scanf() 该函数遇到空格或回车输入结束 Gets() 该函数遇到回车符输入结束 输出 Printf() 输出时遇到’\0’输出结束 Puts() 输出时遇到’\0’输出结束 运算符 优先级 结合方式 优先级:高->低 逻辑运算符 ! 右->左 算术运算符 ++ -- + - * 右->左 * / % + - 左->右 关系运算符 <= < >= > == != 左->右 逻辑运算符 && || 左-> 右 条件表达式 ?: 右->左 赋值运算符 *= /= %= += - = = 右->左

枚举大小sizeof中枚举的大小详解

至从语言开始类型就被作为用户自定义分类有限集合常量地方法被引入到了语言当中,而且一度成为中定义编译期常量地唯一方法(后来在类中引入了静态整型常量). 根据上面对类型地描述,有以下几个问题: .到底所定义出来地类型是一个什么样地类型呢? .作为一个用户自定义地类型其所占用地内存空间是多少呢? .使用类型是否真地能够起到有限集合常量地边界约束呢? .大家可能都知道类型和类型具有隐示(自动)转换地规则,那么是否真地在任何地方都可以使用类型地变量来代替类型地变量呢? . 到底所定义出来地类型是一个什么样地类型呢? 在中大家都知道仅仅有两种大地类型分类:类型(注())和类类型. 所定义地类型其实属于类型,也就是说它会参与到类型地隐示转换规则当中去,所以才会出现类型与类型之间地隐示转换现象. 那么也就是说所定义地类型不具备名字空间限定能力(因为不属于类类型),其所定义地常量子具备和类型所在名字空间相同地可见性,由于自身没有名字限定能力,所以会出现名字冲突现象. 如: { { , }; { , }; }; 上面地例子会出现、名字冲突编译时错误,原因就在于枚举子(、)是名字空间中地名字,同样在引用该中地枚举子时必须采用这样地方式进行,而不是来进行引用. 注()类型: 你可以将类型看作是一种来自外太空地用绿色保护层包装地数据类型,意为“”(译者:如果一定要译成中文,那就叫“彻头彻尾地老数据”怎么样!)这就是类型地含义. 其确切定义相当粗糙(参见标准),其基本意思是类型包含与兼容地原始数据. 例如,结构和整型是类型,但带有构造函数或虚拟函数地类则不是. 类型没有虚拟函数,基类,用户定义地构造函数,拷贝构造,赋值操作符或析构函数. 为了将类型概念化,你可以通过拷贝其比特来拷贝它们.此外,类型可以是非初始化地.b5E2R。 . 作为一个用户自定义地类型其所占用地内存空间是多少呢? 该问题就是( )等于多少地问题,是不是每一个用户自定义地枚举类型都具有相同地尺寸呢? 在大多数地位编译器下(如:、等)一个枚举类型地尺寸其实就是一个( )地大小,难道枚举类型地尺寸真地就应该是类型地尺寸吗? 其实不是这样地,在标准文档()中并没有这样来定义, 标准中是这样说明地:“枚举类型地尺寸是以能够容纳最大枚举子地值地整数地尺寸”, 同时标准中也说名了:“枚举类型中地枚举子地值必须要能够用一个类型表述”, 也就是说,枚举类型地尺寸不能够超过类型地尺寸,但是是不是必须和类型具有相同地尺寸呢?上面地标准已经说得很清楚了,只要能够容纳最大地枚举子地值地整数就可以了,那么就是说可以是、和. 例如:

sizeof深入理解(vcbase)

sizeof深入理解(vcbase) ? 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。 该类型保证能容纳实现所建立的最大对象的字节大小。 ? 2.sizeof是算符,strlen是函数。 ? 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。 sizeof还可以用函数做参数,比如: ?short f(); ?printf("%d\n", sizeof(f())); 输出的结果是sizeof(short),即2。 ? 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 ? 5.大部分编译程序在编译的时候就把sizeof计算过了是类型或是变量的长度这就是sizeof(x)可以用来定义数组维数的原因 ?char str[20]="0123456789"; ?int a=strlen(str); //a=10; ?int b=sizeof(str); //而b=20; ? 6.strlen的结果要在运行的时候才能计算出来,时用来计算字符串的长度,不是类型占内存的大小。 ?7.sizeof后如果是类型必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。 ?8.当适用了于一个结构类型时或变量, sizeof 返回实际的大小,当适用一静态地空间数组, sizeof 归还全部数组的尺寸。 sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸 ?9.数组作为参数传给函数时传的是指针而不是数组,传递的是数组的首地址,如: ?fun(char [8]) ?fun(char []) 都等价于 fun(char *) 在C++里传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小如果想在函数内知道数组的大小,需要这样做:进入函数后用memcpy 拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1] memcpy(buf, p1, len); } 有关内容见: C++ PRIMER? ?10.计算结构变量的大小就必须讨论数据对齐问题。为了CPU存取的速度最快(这同CPU 取数操作有关,详细的介绍可以参考一些计算机原理方面的书),C++在处理数据时经常把结构变量中的成员的大小按照4或8的倍数计算,这就叫数据对齐(data

最新sort函数的用法

sort函数的用法 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort 函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort 函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。 这个函数可以传两个参数或三个参数。第一个参数是要排序的区间首地址,第二个参数是区间尾地址的下一地址。也就是说,排序的区间是[a,b)。简单来说,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了,默认的排序方式是升序。 拿我出的“AC的策略”这题来说,需要对数组t的第0到len-1的元素排序,就写sort(t,t+len); 对向量v排序也差不多,sort(v.begin(),v.end()); 排序的数据类型不局限于整数,只要是定义了小于运算的类型都可以,比如字符串类string。 如果是没有定义小于运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数。比较函数是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。想把刚才的整数数组按降序排列,可以先定义一个比较函数cmp bool cmp(int a,int b) { return a>b; } 排序的时候就写sort(a,a+100,cmp); 假设自己定义了一个结构体node struct node{ int a; int b; double c;

C语言中sizeof()的用法

C语言中sizeof()的用法 2008-12-31 09:45:35.0 来源:51CTO 关键词:C语言 要参加软件研发的笔试(C/C++)几乎都会涉及到sizeof()的用法,我昨天也遇到了,有的也会,但是真正sizeof()的核心还是没有领会,今天上网,无聊中就看到了详细的sizeof()的阐述,现在分享给大家。 ------------sizeof---------------- sizeof 一般形式为:sizeof(object),也可以sizeof var_char,不过大部分programer 习惯用sizeof()。 对象可以是表达式或者数据类型名,当对象是表达式时,括号可省略。sizeof是单目运算符,其运算符的含义是:求出对象在计算机内存中所占用的字节数。一般来讲,不同的机器,运行不同的对象是不一样的,当目前几乎所有的机器都是32位,很少16位的,所以一般考试都是基于32位的window和linux的。 C语言中数据类型不多。 1.整数型的: short,int,long(我没有考虑符号问题),一般c语言书上讲,int是2个字节的,即16位,范围是-32768-32767,long是4个字节,范围是-2^32---2^32-1。当时在xp上运行sizeof(int)的时候,会output 4.这就是32位的原因。sizeof(long)也是4. 如下:#include "stdio.h" #include "string.h" #include "stdlib.h" int main() { short int sa=10; int a=10; long la=10; float f = 20; double d=20; char ch=''c''; char str[]="ABC"; char *p=str; struct str{ double d; char ch; int data; }str_wu; struct str1{ char ch; double d; int data; }str_wu1; printf("sizeof(short):%d\n",sizeof(sa)); printf("sizeof(int):%d\n",sizeof(a));

枚举大小sizeof 中枚举的大小详解

至从C语言开始enum类型就被作为用户自定义分类有限集合常量的方法被引入到了语言当中,而且一度成为C++中定义编译期常量的唯一方法(后来在类中引入了静态整型常量)。 根据上面对enum类型的描述,有以下几个问题: 1.到底enum所定义出来的类型是一个什么样的类型呢? 2.作为一个用户自定义的类型其所占用的内存空间是多少呢? 3.使用enum类型是否真的能够起到有限集合常量的边界约束呢? 4.大家可能都知道enum类型和int类型具有隐示(自动)转换的规则,那么是否真的在任何地方都可以使用enum类型的变量来代替int类型的变量呢? 1. 到底enum所定义出来的类型是一个什么样的类型呢? 在C++中大家都知道仅仅有两种大的类型分类:POD类型(注(1))和类类型。 enum所定义的类型其实属于POD类型,也就是说它会参与到POD类型的隐示转换规则当中去,所以才会出现enum类型与int类型之间的隐示转换现象。 那么也就是说enum所定义的类型不具备名字空间限定能力(因为不属于类类型),其所定义的常量子具备和enum类型所在名字空间相同的可见性,由于自身没有名字限定能力,所以会出现名字冲突现象。 如: struct CEType { enum EType1 { e1, e2 }; enum EType2 { e1, e2 }; }; 上面的例子会出现e1、e2名字冲突编译时错误,原因就在于枚举子(e1、e2)是CEType 名字空间中的名字,同样在引用该CEType中的枚举子时必须采用CEType::e1这样的方式进行,而不是CEType::EType1::e1来进行引用。 注(1)POD类型: 你可以将POD 类型看作是一种来自外太空的用绿色保护层包装的数据类型,POD 意为“Plain Old Data”(译者:如果一定要译成中文,那就叫“彻头彻尾的老数据”怎么样!)这就是POD 类型的含义。 其确切定义相当粗糙(参见C++ ISO 标准),其基本意思是POD 类型包含与C 兼容的原始数据。 例如,结构和整型是POD 类型,但带有构造函数或虚拟函数的类则不是。 POD 类型没有虚拟函数,基类,用户定义的构造函数,拷贝构造,赋值操作符或析构函数。 为了将POD 类型概念化,你可以通过拷贝其比特来拷贝它们。此外,POD 类型可以是非初始化的。 2. 作为一个用户自定义的类型其所占用的内存空间是多少呢? 该问题就是sizeof( EType1 )等于多少的问题,是不是每一个用户自定义的枚举类型都具有相同的尺寸呢? 在大多数的32位编译器下(如:VC++、gcc等)一个枚举类型的尺寸其实就是一个sizeof( int )的大小,难道枚举类型的尺寸真的就应该是int类型的尺寸吗? 其实不是这样的,在C++标准文档(ISO14882)中并没有这样来定义, 标准中是这样说明的:“枚举类型的尺寸是以能够容纳最大枚举子的值的整数的尺寸”, 同时标准中也说名了:“枚举类型中的枚举子的值必须要能够用一个int类型表述”,

类的大小解析 sizeof()中类的大小详解

1、空类的sizeof是1。空类是指没有成员的类,类中的函数不占空间,除非是虚函数。 如:class A { public: A(){} ~A(){} void fun(){} }; sizeof(A)是1. 注:class A1 { public: A1(){} ~A1(){} void fun(){} char a[0]; }; sizeof(A1)也是1.(VC6.0下编译)

2、若类中包含成员,则类对象的大小只包括其中非静态成员经过对齐所占的空间,对齐方式和结构体相同。如: class A { public: int b; float c; char d; }; sizeof(A)是12. class A { public: static int a; int b; float c; char d; }; sizeof(A)是12. class A { public: static int a; int b; float c; char d; int add(int x,int y) { return x+y; }

sizeof(A)也是12. 3、若类中包含虚函数,则无论有几个虚函数,sizeof类都等于sizeof(数据成员)的和+sizeof(V表指针,为4),如: class Base { public: Base(){cout<<"Base-ctor"<

数据结构课后习题及解析第二章word版本

第二章习题 1. 描述以下三个概念的区别:头指针,头结点,首元素结点。 2. 填空: (1)在顺序表中插入或删除一个元素,需要平均移动元素,具体移动的元素个数与有关。 (2)在顺序表中,逻辑上相邻的元素,其物理位置相邻。在单链表中,逻辑上相邻的元素,其物理位置相邻。 (3)在带头结点的非空单链表中,头结点的存储位置由指示,首元素结点的存储位置由指示,除首元素结点外,其它任一元素结点的存储位置由指示。3.已知L是无表头结点的单链表,且P结点既不是首元素结点,也不是尾元素结点。按要求从下列语句中选择合适的语句序列。 a. 在P结点后插入S结点的语句序列是:。 b. 在P结点前插入S结点的语句序列是:。 c. 在表首插入S结点的语句序列是:。 d. 在表尾插入S结点的语句序列是:。 供选择的语句有: (1)P->next=S; (2)P->next= P->next->next; (3)P->next= S->next; (4)S->next= P->next; (5)S->next= L; (6)S->next= NULL; (7)Q= P; (8)while(P->next!=Q) P=P->next; (9)while(P->next!=NULL) P=P->next; (10)P= Q; (11)P= L; (12)L= S; (13)L= P; 4. 设线性表存于a(1:arrsize)的前elenum个分量中且递增有序。试写一算法,将X插入到线性表的适当位置上,以保持线性表的有序性。 5. 写一算法,从顺序表中删除自第i个元素开始的k个元素。 6. 已知线性表中的元素(整数)以值递增有序排列,并以单链表作存储结构。试写一高效算法,删除表中所有大于mink且小于maxk的元素(若表中存在这样的元素),分析你的算法的时间复杂度(注意:mink和maxk是给定的两个参变量,它们的值为任意的整数)。 7. 试分别以不同的存储结构实现线性表的就地逆置算法,即在原表的存储空间将线性表(a1, a2..., an)逆置为(an, an-1,..., a1)。 (1)以一维数组作存储结构,设线性表存于a(1:arrsize)的前elenum个分量中。 (2)以单链表作存储结构。 8. 假设两个按元素值递增有序排列的线性表A和B,均以单链表作为存储结构,请编写算法,将A表和B表归并成一个按元素值递减有序排列的线性表C,并要求利用原表(即A 表和B表的)结点空间存放表C。

Sizeof与Strlen的区别与联系

Sizeof与Strlen的区别与联系 1.sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int 类型。 该类型保证能容纳实现所建立的最大对象的字节大小。 2.sizeof是运算符,strlen是函数。 3.sizeof可以用类型做参数,strlen只能用char*做参数,且必须是以''\0''结尾的。 sizeof还可以用函数做参数,比如: short f(); printf("%d\n", sizeof(f())); 输出的结果是sizeof(short),即2。 4.数组做sizeof的参数不退化,传递给strlen就退化为指针了。 5.大部分编译程序在编译的时候就把sizeof计算过了,看它是类型或是变量的长度,这就是sizeof(x)可以用来定义数组维数的原因。 char str[20]="0123456789"; int a=strlen(str); //a=10; int b=sizeof(str); //而b=20; 6.strlen的结果要在运行的时候才能计算出来,主要用来计算字符串的长度,不是类型占内存的大小。 7.sizeof后如果接类型参数必须加括弧,如果是变量名可以不加括弧。这是因为sizeof是个操作符不是个函数。 8.当适用了于一个结构类型时或变量,sizeof 返回实际的大小,当适用一静态地址空间数组,sizeof 归还全部数组的尺寸。sizeof 操作符不能返回动态地被分派了的数组或外部的数组的尺寸。 9.数组作为参数传给函数时,传递的是指针而不是数组,传递的是数组的首地址,如: fun(char [8]) fun(char []) 都等价于 fun(char *) 在C++里参数传递数组永远都是传递指向数组首元素的指针,编译器不知道数组的大小。如果想在函数内知道数组的大小,需要这样做: 进入函数后用memcpy拷贝出来,长度由另一个形参传进去 fun(unsiged char *p1, int len) { unsigned char* buf = new unsigned char[len+1]

相关文档
最新文档