我是靠谱客的博主 天真摩托,这篇文章主要介绍牛客错题记录Q1:标识符命名规则Q2:空类占的内存大小?Q3:析构函数Q4:数组指针,现在分享给大家,希望可以做个参考。

Q1:标识符命名规则

  C、C++ 的标识符只能由英文字母、数字、下划线组成,其中第一个字符不能是数字。
  Java 的标识符除了英文字符、数字、下划线之外,还可以有美元符号 $ ,第一个字符同样不能是数字。

Q2:空类占的内存大小?

  问题:在Windows 32位操作系统中,假设字节对齐为4,对于一个空的类A,sizeof(A)的值为()?

  选项:A:0;B:1;C:2;D:3

  解析:类的实例化是在内存中分配一块地址,每个实例在内存中都有独一无二的地址。同样,空类也会实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化后就有独一无二的地址了。所以,空类的sizeof为 1,而不是 0。多重继承的空类的大小也是1。

  答案: B。

Q3:析构函数

  问题: 如果有一个类是 myClass , 关于下面代码正确描述的是:

复制代码
1
2
3
4
5
myClass::~myClass() { delete this; this = NULL; }

  选项:
 A:正确,我们避免了内存泄漏
 B:它会导致栈溢出
 C:无法编译通过
 D:这是不正确的,它没有释放任何成员变量。

  解析: this 是 myClass * const 类型的指针,因此给 this 赋值导致编译错误。如果没有 this = NULL; 那么 delete this; 会导致栈溢出。

Q4:数组指针

  问题: 下列代码的运行结果

复制代码
1
2
3
4
int a[5] = {1,3,5,7,9}; int *p = (int *)(&a+1); printf(%d,%d”,*(a+1)*(p-1));

  解析: *(a+1)其实很简单就是指a[1],输出为3。 问题关键就在于第二个点,*(p-1)输出为多少? 解释如下,&a+1不是首地址+1,系统会认为加了一个整个a数组,偏移了整个数组a的大小(也就是5个int的大小)。所以intp=(int)(&a+1);其实p实际是&(a[5]),也就是a+5. 原因为何呢? &a是数组指针,其类型为int(*)[5]; 而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加5*sizeof(int),所以p实际是a[5],但是p与(&a+1)类型是不一样的,这点非常重要,所以p-1只会减去sizeof(int*),a,&a的地址是一样的,但意思就不一样了,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5]。

最后

以上就是天真摩托最近收集整理的关于牛客错题记录Q1:标识符命名规则Q2:空类占的内存大小?Q3:析构函数Q4:数组指针的全部内容,更多相关牛客错题记录Q1:标识符命名规则Q2:空类占内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(69)

评论列表共有 0 条评论

立即
投稿
返回
顶部