你可能不知道的编程小问题:预处理、sizeof
来源:互联网 发布:web服务器软件排名 编辑:程序博客网 时间:2024/05/23 02:11
struct aa{int a;char b[20];};
答案--#define FIND(struct,e) (size_t)&(((struct*)0)->e)。FIND(aa,a);//等于0;FIND(aa,b);//等于4
解析--(struct *) 0表示把一段地址(以0开头的地址)看作struc(认为这里存储一个stuct变量);((struc *) 0)->e指向它的成员e;&(((struc*) 0)->e)取这个成员的地址,因为该结构体的首地址为0,所以就得到成员e距离结构体首地址的偏移量。(size_t) &(((struc*) 0)->e)把地址硬转为size_t类型(typedef unsigned int size_t)
注意:宏在C语言里及其重要,而在C++里的第一规则是:绝不应该去使用它,除非你不得不这样做!
面试题十、下面代码的输出结果是什么?
struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B;struct{double a1;float a2;int b;char c;}C;int main(){char s1[] = "0123456789";char* s2 = "0123456789";int s3[100];int* s4 = s3;cout<<sizeof(s1)<<endl;cout<<sizeof(s2)<<endl;cout<<sizeof(s3)<<endl;cout<<sizeof(s4)<<endl;cout<<sizeof(A)<<endl;cout<<sizeof(B)<<endl;cout<<sizeof(C)<<endl;}答案--
11-----s1代表一个数组,使用sizeof会返回该数组分配到了字节(虽然数组名跟指针同是地址,但代表的意义不一样)
4-------s2是一个指针,其长度是固定的,4字节
400---s3分配了400个字节
4-------同s2
6-------这里涉及到了结构体的对齐问题,结构体内的数据以最长的数据元素为对齐单位。a1、a2、a3都是2字节,所以sizeof(A)为6
8-------B中a1取4字节,a2去2字节,以4字节对齐,所以sizeof(B)为8
24-----C中a1去8字节,a2、a3共占8字节、a4取1字节,所以sizeof(C)为24
面试题十二、且看下列代码(sizeof和strlen的区别)
char s1[100] = "0123456789";int s2[100];cout<<sizeof(s1)<<" "<<strlen(s1);cout<<sizeof(s2)<<" "<<strlen(s2);//编译会出错答案--100 10
解析--上题已经说到,sizeof返回该数组(类型)分配到的字节,sizeof(int)为4,它是一个运算符,返回类型是unsigned int <size_t>
strlen是一个函数,用来计算字符串的长度,只能用char* 做参数,且必须是以“\0”结尾的,如果你这样做:char* a; strlen(a);那么恭喜你,你的程序会马上死掉。
面试题十三、且看下面代码(空类占用的空间)
class A{};class A2{};class B : public A{};class C : public A,public A2{};class D : public virtual A{};class E{virtual void f(){};};int main(){cout<<sizeof(A)<<" ";cout<<sizeof(A2)<<" ";cout<<sizeof(B)<<" ";cout<<sizeof(C)<<" ";cout<<sizeof(D)<<" ";cout<<sizeof(E)<<" ";}答案--1 1 1 1 4 4
解析--空类占1字节空间(规定),单一继承和多重继承还是占用1字节,但是涉及到虚函数、虚继承的有个虚表(虚指针),所以占用4字节。
- 你可能不知道的编程小问题:预处理、sizeof
- 你可能不知道的编程小问题:程序基本概念
- 63个你可能不知道的生活小窍门
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 你可能不知道的10个JavaScript小技巧
- 如何完成支付宝的支付功能?
- 黑马程序员_学习笔记第14天集合(一)_List、Set
- ACMjava求解最大连续和的三种方法 暴力枚举,S前缀,回溯法
- C++界面库
- 无限级分类之循环家谱树
- 你可能不知道的编程小问题:预处理、sizeof
- <%@ include file=""%>与<jsp:include page=""/>区别
- cvCreateMemStorage函数
- 如何定义领域模型(概念模型)
- richfaces界面数值转换和条件判断
- [课程地图-jsp网站]JSP开发要求和详细介绍
- 几款国产开源的Windows界面库
- iOS开发之地图开发引入第三方百度地图
- 关于下拉列表响应url