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
是指以两位格式输出,不足两位,前补空格;超过两位,全部输出。