【练习】

1、有以下程序

#include
#include<stdio.h>
using namespace std;
int main(){
int m=0123, n = 123;
printf("%o %o\n", m, n);
return 0;
}

程序运行后的输出结果是:

A 0123 0173
B 0123 173
C 123 173
D 173 173

答:D %o以八进制输出
2、7. 关于"深拷贝",下列说法正确的是()

A 会拷贝成员数据的值和会拷贝静态分配的成员对象
B 只会拷贝成员数据的值
C 只会拷贝静态分配的成员对象
D 只会拷贝动态分配的成员对象

答:A

对于
struct X { int x; int y; };
深浅拷贝没有区别
而一旦有了引用或者指针例如:
struct X { int x; int y; int* p; };
浅拷贝依然只是直接拷贝x, y , p,但是对于指针或者引用来说,若是只是拷贝表面,那么拷贝后的物体的指针也和原来的指针指向的是同一个对象,那么如果原来的物体销毁了,但是现在拷贝的物体还在,那么这时候你拷贝后的物体的成员指针就是一个悬挂指针,指向了不再存在的物体,访问便会出错。
而对于深拷贝,遇到指针的时候,他会知道new出来一块新的内存,然后把原来指针指向的值拿过来,这样的代价会比浅拷贝耗费的精力更大,但是当原来的物体销毁后,拷贝的指针依然有效。
但是大部分情况下都是使用浅拷贝

3、 下面关于"指针"的描述不正确的是()

A 当使用free释放掉一个指针内容后,指针变量的值被置为NULL
B 32位系统下任何类型指针的长度都是4个字节
C 指针的数据类型声明的是指针实际指向内容的数据类型
D 野指针是指向未分配或者已经释放的内存地址

答:A

free掉一个指针后,指针仍然指向原来的地址,free的意义在于告诉系统目标地址已经被收回

4、以下程序统计给定输入中每个大写字母的出现次数(不需要检查输入合法性)

void AlphabetCounting(char a[],int n){
int count[26]={},i,kind=0;
for(i=0;i<n;++i) (1);
for(i=0;i<26;++i){
if(++kind>1) putchar(';');
printf("%c=%d",(2));
}
}

以下能补全程序,正确功能的选项是()

A ++count[a[i]-‘Z’];‘Z’-i,count[‘Z’-i]
B ++count[‘A’-a[i]];‘A’+i,count[i]
C ++count[i];i,count[i]
D ++count[‘Z’-a[i]];‘Z’-i,count[i]
E ++count[a[i]];‘A’+i,count[a[i]]

答:D

题意为输入设定全是大写 (ASCII码A-Z为65-90,递增):
一、count存储A-Z的个数,即count[0]存储A的个数,于是 ++count[a[i]-‘A’]; 'A’+i,count[i];
二、count存储Z~A的个数,即count[0]存储Z的个数,于是 ++count[‘Z’-a[i]]; ’Z’-i,count[i]。 所以答案为D

5、下面代码会输出()

int main(){
int a[4]={1,2,3,4};
int ptr=(int)(&a+1);
printf("%d",*(ptr-1));
}
A.4 B.1 C.2 D.3

答:A

其实测试可以发现,a 和 &a 是同一个地址,printf("%d",a),printf("%d", &a)结果是相同的。
但是其代表的含义不同,(a+1)代表从a数组首地址跳跃一个int的长度,(&a+1)表示从a数组首地址跳跃一个数组的长度,也就是指向a数组最后一个元素的下一个位置,因此*(ptr- 1)表示a数组的最后一个元素。

6、请找出下面程序中有哪些错误:

int main()
{
int i=10;
int j=1;
const int *p1;//(1)
int const *p2=&i; //(2)
p2=&j;//(3)
int *const p3=&i;//(4)
*p3=20;//(5)
*p2=30;//(6)
p3=&j;//(7)
return 0;
} 

A 1,2,3,4,5,6,7
B 1,3,5,6
C 6,7
D 3,5

答:C

1)const intp1:表示不能通过指针p1修改它指向的内存单元的值,但是p1本身可修改。
(2)int const
p2=&i:与p1相同,即不能修改p2指向的内存单元的值,但是可以修改p2使其指向其它的内存单元。这里p2指向了整型变量i
(3)p2=&j:修改p2,使其指向整型变量 j ,由(2)可知(3)没错。
(4)int*constp3=&i:p3本身是指向整型变量的常指针,即p3初始化后不能再指向其它的内存单元,但是可以修改p3指向的内存单元的值。这里p3指向了整型变量i。
(5)*p3=20:通过p3将变量i的值修改为2,由(4)可知(5)没错。
(6)*p2=30:通过p2修改它所指向的内存单元的值,由(2)可知(6)错误。
(7)p3=&j:修改p3,使其指向j,由(4)可知(7)错误。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值