c/c++ 那些你一定出错的数组笔试题

简介: c/c++ 那些你一定出错的数组笔试题

一.一维整形数组

在进行题目的联系讲解之前,我们要对以下知识点有一个基础的认知:

数组名的理解:数组名是数组首元素的地址

但是有2个例外

  1. sizeof(数组名),这里的数组名表示整个数组,sizeof(数组名)计算的是整个数组的大小,单位是字节
  2. &数组名,这里的数组名表示整个数组,&数组名取出的是数组的地址

首先,我们定义一个数组,里面一共有 4 个整形元素,接下来的一维数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

  //一维数组
  int a[] = { 1,2,3,4 };
  //4个元素,每个元素使int类型(4个字节)

题目一:

printf("%d\n", sizeof(a));

输出结果:16

       数组名 a 单独放在sizeof内部,数组名表示整个数组,计算的是整个数组的大小单位是字节,是 16 字节

题目二:

printf("%d\n", sizeof(a + 0));

输出结果:4

       a 并非单独放在sizeof内部,也没有 &,所以数组名a是数组首元素的地址,a+0还是首元素的地址,是地址大小就是 4/8 Byte

题目三:

printf("%d\n", sizeof(*a));

输出结果:4

       a 并非单独放在 sizeof 内部,也没有 &,所以数组名 a 是数组首元素的地址,*a 就是首元素,大小就是 4 Byte ,*a == *(a+0) == a[0]

题目四:

printf("%d\n", sizeof(a + 1));

输出结果:4

      a 并非单独放在 sizeof 内部,也没有 &,所以数组名 a 是数组首元素的地址,a+1 就是第二个元素的地址,a+1 == &a[1] ,是第2个元素的地址,是地址就是 4/8 个字节

题目五:

printf("%d\n", sizeof(a[1]));

输出结果:4

       a[1] 就是数组的第二个元素,这里计算的就是第二个元素的大小,单位是字节

题目六:

printf("%d\n", sizeof(&a));

输出结果:4

       &a - 是取出数组的地址,但是数组的地址也是地址,是地址就是4/8个Byte,数组的地址 和 数组首元素的地址 的本质区别是类型的区别,并非大小的区别


题目七:

printf("%d\n", sizeof(*&a));

输出结果:16

       对数组指针解引用访问一个数组的大小,单位是字节,sizeof(*&a) --- sizeof(a)


题目八:

printf("%d\n", sizeof(&a + 1));

输出结果:4

       &a 数组的地址,&a+1 还是地址,是地址就是 4/8 个字节


题目九:

printf("%d\n", sizeof(&a[0]));

输出结果:4

       &a[0] 是首元素的地址, 计算的是地址的大小 4/8 个字节

题目十:

printf("%d\n", sizeof(&a[0] + 1));

输出结果:4

       &a[0] 是首元素的地址,&a[0]+1 就是第二个元素的地址,大小 4/8 个字节


二.一维字符数组

       首先,我们定义一个字符型数组,接下来的数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

  //字符数组
  char arr[] = { 'a','b','c','d','e','f' };//6 个元素

题目一:

printf("%d\n", sizeof(arr));

输出结果:6


题目二:

printf("%d\n", sizeof(arr + 0));

输出结果:4

      arr 是首元素的地址==&arr[0],是地址就是 4/8 个字节


题目三:

printf("%d\n", sizeof(*arr));

输出结果:1 

       arr是首元素的地址,*arr就是首元素,大小就是1Byte


题目四:

printf("%d\n", sizeof(arr[1]));

输出结果:1

       访问数组第一个元素大小,为char类型


题目五:

printf("%d\n", sizeof(&arr));

输出结果:4

       &arr是数组的地址,sizeof(&arr)就是 4/8 个字节


题目六:

printf("%d\n", sizeof(&arr + 1));

输出结果:4

       &arr+1 是跳过数组后的地址,是地址就是 4/8 个字节


题目七:

printf("%d\n", sizeof(&arr[0] + 1));

输出结果:4

      第二个元素的地址,是地址就是 4/8 Byte


三.二维数组

       我们初始化二维数组如下,接下来的数组的所有题目都是基于此讨论会有怎么样的输出(以32位机器为例)

int a[3][4] = { 0 };



题目一:

printf("%zd\n", sizeof(a));

输出结果:48

       数组名 a 单独放在了 sizeof 内存,表示整个数组,sizeof(a) 计算的是数组的大小,单位是字节


题目二:

printf("%zd\n", sizeof(a[0][0]));

输出结果:4

      a[0][0] 是数组的第一行第一个元素,这里计算的就是一个元素的大小,单位是字节


题目三:

printf("%zd\n", sizeof(a[0]));

输出结果:16

       a[0] 是第一行这个一维数组的数组名,数组名单独放在了 sizeof 内部,sizeof(a[0]) 计算的整个第一行这个一维数组的大小


题目四:

printf("%zd\n", sizeof(a[0] + 1));

输出结果:4

       a[0] 并非单独放在 sizeof 内部,也没有 &,所以 a[0] 表示第一行这个一维数组首元素的地址,也就是第一行第一个元素的地址

       a[0] <---> &a[0][0]

       a[0]+1 ---> &a[0][1]


题目五:

printf("%zd\n", sizeof(*(a[0] + 1)));

输出结果:4

       a[0] + 1是第一行第二个元素的地址,*(a[0] + 1))就是第一行第二个元素


题目六:

printf("%zd\n", sizeof(a + 1));

输出结果:4   a 作为二维数组的数组名,并没有单独放在 sizeof 内部,也没有 &,a 就是数组首元素的地址,也就是第一行的地址, a 的类型是 int(*)[4],a+1 就是第二行的地址,类型是:int(*)[4]


题目七:

printf("%zd\n", sizeof(*(a + 1)));

输出结果:16   a+1是第二行的地址,*(a+1)就是第二行,计算的就是第二行的大小

       另外一个角度理解:*(a+1) -- a[1],sizeof(a[1]) - a[1] 这个第二行的数组名,单独放在了 sizeof 内部,计算的是第二行的大小


题目八:

printf("%zd\n", sizeof(&a[0] + 1));

输出结果:4

     a[0] 是第一行的数组名,&a[0] 取出的是数组的地址,取出的是第一行这个一维数组的地址,类型就是 int(*)[4] ,&a[0]+1 就是第二行的地址,类型就是 int(*)[4]


题目九:

printf("%zd\n", sizeof(*(&a[0] + 1)));

输出结果:16

       *(&a[0] + 1) 得到的就是第二行,计算的就是第二行的大小


题目十:

printf("%zd\n", sizeof(*a));

输出结果:16

      a 表示数组首元素的地址,也就是第一行的地址,*a 就是第一行,也就相当于是第一行的数组名,*a--> *(a+0) -- a[0]


题目十一:

printf("%zd\n", sizeof(a[3]));

输出结果:16

      输出结果不会越界,还是作为一行的结果进行输出,代表一行的大小,所以是 16




本次分享就到此为止了,如有错误欢迎积极指正,希望我的分享对您有所帮助

目录
相关文章
|
6月前
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
124 4
|
2月前
|
存储 算法 搜索推荐
【C++面向对象——群体类和群体数据的组织】实现含排序功能的数组类(头歌实践教学平台习题)【合集】
1. **相关排序和查找算法的原理**:介绍直接插入排序、直接选择排序、冒泡排序和顺序查找的基本原理及其实现代码。 2. **C++ 类与成员函数的定义**:讲解如何定义`Array`类,包括类的声明和实现,以及成员函数的定义与调用。 3. **数组作为类的成员变量的处理**:探讨内存管理和正确访问数组元素的方法,确保在类中正确使用动态分配的数组。 4. **函数参数传递与返回值处理**:解释排序和查找函数的参数传递方式及返回值处理,确保函数功能正确实现。 通过掌握这些知识,可以顺利地将排序和查找算法封装到`Array`类中,并进行测试验证。编程要求是在右侧编辑器补充代码以实现三种排序算法
52 5
|
10月前
|
存储 编译器 C语言
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题(下)
从C语言到C++_34(C++11_下)可变参数+ lambda+function+bind+笔试题
131 5
|
6月前
|
C++
C++(十一)对象数组
本文介绍了C++中对象数组的使用方法及其注意事项。通过示例展示了如何定义和初始化对象数组,并解释了栈对象数组与堆对象数组在初始化时的区别。重点强调了构造器设计时应考虑无参构造器的重要性,以及在需要进一步初始化的情况下采用二段式初始化策略的应用场景。
|
7月前
|
算法 C++
c++学习笔记04 数组
这篇文章是C++学习笔记4,主题是数组。
62 4
|
8月前
|
C++ 索引 运维
开发与运维数组问题之在C++中数组名和指针是等价如何解决
开发与运维数组问题之在C++中数组名和指针是等价如何解决
50 6
|
8月前
|
存储 安全 C++
开发与运维数组问题之声明一个数组如何解决
开发与运维数组问题之声明一个数组如何解决
56 6
|
7月前
|
C++ 索引
C++数组、vector求最大值最小值及其下标
C++数组、vector求最大值最小值及其下标
246 0
|
8月前
|
存储 C++ 容器
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
开发与运维数组问题之C++标准库中提供数据容器作为数组的替代如何解决
90 5
|
7月前
|
安全 编译器 C语言
C++入门-数组
C++入门-数组