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是指以两位格式输出,不足两位,前补空格;超过两位,全部输出。
本文深入探讨了C++中的指针概念,包括const指针的不同使用方式及其效果对比,指针取值的细节,以及int类型的函数指针数组声明。同时,解析了内部类的访问权限,尤其是静态内部类与非静态内部类访问外围类数据的区别。通过具体代码示例,阐述了C++中指针与内部类的运作机制。
1045

被折叠的 条评论
为什么被折叠?



