IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 错题汇总2 -> 正文阅读

[C++知识库]错题汇总2

1.下列程序的打印结果是?

char p1[15]= "abcd",*p2= "ABCD", str[50]= "xyz";
strcpy(str+2,strcat(p1+2,p2+1));
printf("%s",str);

A xyabcAB

B abcABz

C ABabcz

D xycdBCD

E 运行出错

解析:这道题实际上我并没有做错,但感觉这个知识点记得并不是很牢靠,不敢保证下一次也不会错,所以记之。

strcpy(a, b):将字符串b中的内容拷贝到a所在的空间,最后返回a。使用时必须注意,a的空间必须大于b的字符串大小,否则会导致崩溃。

strcat(a, b):将字符串b中的内容拼接在字符串a之后,最终返回a。使用时必须注意,a的空间必须可以容纳a、b两个字符串。

2.下面程序的输出结果是?

#include<iosteam>

void main(){
    int n[][3] = {10,20,30,40,50,60};
    int (*p)[3];
    p=n;
    cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
}

A 10,30,50

B 10,20,30

C 20,40,60

D 10,30,60?

解析:数组名是数组的首地址,数组n中第一个元素的类型是int[3]。n的二维数组中,首元素的地址就是int(*)[3]。恰好与(*p)[3]的类型相同。

所以p = n可以完成赋值,(*p)[3]的三个元素分别是10,20,30。

int (*p)[3]的意义是,p是一个指针,指向一个有3个int类型元素的数组。数组指针必须经过初始化或者赋值后才可以使用,否则会导致编译报错。

3.有一个如下的结构体:?

struct A{
long a1;
short a2;
int a3;
int *a4;
};

?请问在64位编译器下用sizeof(struct A)计算出的大小是多少?

A 24

B 28

C 16

D 18?

解析:这个并没有什么难点。如果非要说的话,那就是在不同的操作系统中,long类型的长度可能是4,可能是8。比如Linux操作系统下就为8,但是在VS中,不论是64位编译器还是32位编译器long类型长度都是4个字节。但在这道题无伤大雅。

给出了64位编译器,默认对齐数为8。?

按照Linux的8字节计算,

long(8) —— 占8个字节

short(2)、int(4) —— 占8个字节(这8个字节中放不下下一个元素)

int* (8) —— 占8个字节

共计24

按照VS的4个字节计算

long(4)、short(2) —— 占8个字节(这8个字节中放不下下一个元素)

int(4) —— 占8个字节(这8个字节中放不下下一个元素)

int* (8) —— 占8个字节

共计24

在这里我们再移植过来一个知识点:

64位操作系统上64位编译器,默认对齐数8

64位操作系统上32位编译器,默认对齐数8

32位操作系统上32位编译器,默认对齐数4

4.数组定义为”int a[4][5];”, 引用”*(a+1)+2″表示()(从第0行开始)?

A a[1][0]+2

B a数组第1行第2列元素的地址

C a[0][1]+2

D a数组第1行第2列元素的值?

解析:这道题充分体现了二维数组的离谱之处。?

int a[4][5]是一个二维数组,数组有4个元素,每个元素都是一个拥有5个int类型元素的数组。

a + 1 所代表的是 a[1]

解引用之后再加2,也就是a[1][2]了。

?二维数组着实是C语言之中比较坑人的知识点。

大部分教材对于二维数组的名字,只是浅浅淡淡的一句——数组名表示数组第一个元素的地址。

然后呢?然后全靠脑补。

第一个元素的地址,首先我们要知道的是,二维数组,虽然我们很多人以理解矩阵的方式来代入它,但实际上,它与矩阵之间有着天差地别。

二维数组a[4][5]的第一个元素,是一个拥有5个int型变量的数组,即int[5]。而我们通常所说的第一个元素,就真的是它实实在在的第一个元素,第零行第零列的那个。

//C++
int main() {
    int a[2][3];
    cout << typeid(*a).name() << endl;
    cout << typeid(**a).name() << endl;
    return 0;
}

?如图所示,虽然二维数组的数组名可以经过两次解引用,但这并不代表它就是二级指针:

//C++
int main() {
    int a[2][3];
    cout << typeid(*a).name() << endl;
    int(*p)[3] = a;
    cout << typeid(p).name() << endl;
    cout << typeid(*p).name() << endl;
    return 0;
}

?可见,数组指针也具有与之相同的特性,但是可以明确的是,数组指针的数组名绝对不是一个二维数组。

当我们想要将二维数组名赋值给一个二维数组时,我们可以得到如下报错:

?好了,拨云见月。

我真切是个嘴笨的人,并不知道该如何描述,如何详细的介绍此处的内容。可能随着今后不断地学习,我才可以详尽地对这里地原理等做出至少令我个人满意地讲解。

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-04-30 08:30:43  更:2022-04-30 08:32:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 2:02:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码