练习错题解析

const指针

  • (单选题)下面三段程序代码的效果一样吗?
int b;
(1)const int *a = &b;
(2)int const *a = &b;
(3)int *const a = &b;
  • (2)=(3)
  • (1)=(3)
  • (1)=(2)
  • 都不一样
  • 都一样
    解析: 主要根据 const*的相对位置判断, const*左边,则指针指向的变量值不能通过指针改变,但仍然可以通过其他方式改变; const*右边,则指针的指向不能改变。简记为左定值,又定向

内部类

  • (单选题)
    静态内部类不可以直接访问外围类的非静态数据,而非静态内部类可以直接访问外围类的数据,包括私有数据。()
  • 正确
  • 错误
    解析: 前半句静态内部类不可以直接访问外围类的非静态数据,因为静态类随着外围类的加载而诞生,可以不依赖外围类的实例而实例化,而非静态资源依赖类的实例化,如果允许静态内部类访问非静态外围资源,可能导致操作没有实例化的对象,所以不能允许静态内部类直接访问外围类的非静态数据。后半句不知道道理怎么讲。

指针取值

  • (单选题) 下面程序的输出是什么?
int main(void)
{
	int a[5] = {1, 2, 3, 4, 5};
	int *tpr = (int *)(&a +1);
	printf("%d,%d", *(a + 1), *(tpr - 1));
	return 0;
}
  • 2 1
  • 2 5
  • 1 2
  • 5 2

解析: 指针类型的数据包括两部分,地址及所指数据的类型,&a取得是整个数组的地址,对应的地址是数组起始位置的地址,指针对应的长度应该为数组的长度。数组的运算是以所指类型对应的内存大小确定的,这里的&a+1表示将&a所指地址向后移动一个单位长度,如图所示。(int *)对其进行强制类型转化,所以tpr又变回指向整形数据的指针。想通这里,问题自然就解决了。

在这里插入图片描述

  • (单选题)
    下面C++程序的输出是___________。
void f(char * x)
{
	x++;
	*x='a';
}
int main()
{
	char str [sizeof("hello")];
	strcpy(str, "hello");
	f(str);
	cout<<str;
	return 0;
}
  • hello
  • hallo
  • allo
  • 以上都不是

**解析:**这道题主要考察的是函数参数传递问题,在C++中,函数调用是形式参数进行,即函数的运行不会对输入的参数造成改变。这里str作为参数调用函数,在函数中有参数自加行为x++,但是这不会对str产生影响,而函数第二行*x='a';通过指针改变了字符串内部的值。

  • (单选题)int (*p[10])(int*)声明了p是一个:
  • 指向函数的指针
  • 返回指针的函数
  • 元素为函数指针的数组
  • 入参为数组指针的函数
  • (单选题)以下运行结果是:X= ( ) ?
#include<stdio.h>
main()
{
	int i,j,X=0;
	for(i=0;i<2;i++)
	{
		X++;
		for(j=0;j<3;j++)
		{
			if(j%2) continue;
			X++;
		}
		X++;
	}
printf("x=%d\n",X);
}
  • 4
  • 6
  • 8
  • 9
    解析: 内部j循环判定j%2==0时,运行X++,其中j的值取0 1 2,意味着运行两次X++,对于外围i循环,每次循环导致4次X++,最后输出结果为8。
  • 假定 T是一个C++ 类,下列语句执行后,内存里创建了( ) 个T对象。
T b(5);
T c[6];
T &d=b;
T e=b;
T *p = new T (4);
  • 5
  • 8
  • 9
  • 12
    解析: 其中引用&d并没有创建新的对象,但是还有一个选项是没有创建对象的,至于道理还没有想通,下次看到再补充。
  • 下面函数输出结果是什么:
int main((){
int k= 12345;
printf("%2d\n",k);
return 0;
}
  • 12
  • 45
  • 12345
  • 无法通过编译
    解析: printf("%2d\n",k)%2d是指以两位格式输出,不足两位,前补空格;超过两位,全部输出。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值