我是靠谱客的博主 天真摩托,最近开发中收集的这篇文章主要介绍牛客错题记录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 , 关于下面代码正确描述的是:

myClass::~myClass() {
	delete this;
	this = NULL;
}

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

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

Q4:数组指针

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

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:空类占的内存大小?Q3:析构函数Q4:数组指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部