指针和数组笔试题解析(上)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: 指针和数组笔试题解析(上)

本篇博文,将从指针和数组来为大家分析一些笔试题,设计内容多,全是干货,接下来让我们一起来看一下吧


数组笔试题


在做题之前,我们需要明白

数组名是数组首元素的地址
    但是有2个例外:
    1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节
    2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址


一维数组


我们首先看题,答案再代码后面

1. int a[] = {1,2,3,4};
2. printf("%d\n",sizeof(a));//  16
3. printf("%d\n",sizeof(a+0));//  4/8
4. printf("%d\n",sizeof(*a));//  4
5. printf("%d\n",sizeof(a+1));//  4/8
6. printf("%d\n",sizeof(a[1]));//  4
7. printf("%d\n",sizeof(&a));//  4/8
8. printf("%d\n",sizeof(*&a));//  16
9. printf("%d\n",sizeof(&a+1));//  4/8
10. printf("%d\n",sizeof(&a[0]));//  4/8
11. printf("%d\n",sizeof(&a[0]+1));//  4/8

接下来博主会为大家一句一句进行解释

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

解释:sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,所以是16

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

解释:这里的sizeof没有和a直接相连,所以这里并不是整个数组,这里a代表数组首元素的地址,a+0依然是首元素的地址,既然是地址,所以大小为4或8,具体大小由编译器决定

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

解释:*a是数组的首元素,且为int型,所以大小为4

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

解释:a为首元素的地址,a+1为第二个元素的地址,所以大小为4或8

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

解释:a[1]为第二个元素,大小为8

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

解释:&a为地址,所以大小为4或8

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

解释:&a是a的地址,前面加上解引用*,则*&a就为a,所以大小为16

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

解释:&a是地址,那么&a+1也还是地址,所以大小为4或8

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

解释:&a[0]是首元素地址,既然是地址,所以大小为4或8

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

解释:&a[0]为地址,那么&a[0]+1也是地址,既然是地址,所以大小为4或8


字符数组


题  一


1. char arr[] = {'a','b','c','d','e','f'};
2. printf("%d\n", sizeof(arr));//  6
3. printf("%d\n", sizeof(arr+0));//  4/8
4. printf("%d\n", sizeof(*arr));//  1
5. printf("%d\n", sizeof(arr[1]));//  1
6. printf("%d\n", sizeof(&arr));//  4/8
7. printf("%d\n", sizeof(&arr+1));//  4/8
8. printf("%d\n", sizeof(&arr[0]+1));//  4/8

解释如下

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

解释:数组名单独放在sizeof内部,这里的arr表示整个数组,计算的是整个数组的大小,单位是字节,总共6个字节

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

解释:arr表示数组首元素的地址,arr+0还是数组首元素的地址,是地址就是4/8个字节

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

解释:arr表示数组首元素的地址,*arr就是首元素,大小1个字节

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

解释:arr[1]就是第二个元素,大小是1个字节

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

解释:&arr是数组的地址,但是数组的地址也是地址,是地址就是4/8

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

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

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

解释:第二个元素的地址,是4/8个字节


题  二


1. char arr[] = { 'a','b','c','d','e','f' };
2. printf("%d\n", strlen(arr));//随机值
3. printf("%d\n", strlen(arr + 0));//arr 
4. printf("%d\n", strlen(*arr));//err
5. printf("%d\n", strlen(arr[1]));//err
6. printf("%d\n", strlen(&arr));//随机值
7. printf("%d\n", strlen(&arr + 1));//随机值
8. printf("%d\n", strlen(&arr[0] + 1));//随机值

在讲解提二是我们需要了解以下strlen这个函数

格式为

还需要了解一下这个arr的存储

 

明白这些后,我们开始解释代码

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

解释:因为字符数组arr中没有\0,所以在求字符串长度的时候,会一直往后找,产生的结构就是随机值

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

解释:arr + 0是首元素的地址,和第一个一样,也是随机值

printf("%d\n", strlen(*arr));//err,

解释: arr是数组首元素的地址,*arr就是数组首元素,就是'a'-97,strlen函数参数的部分需要传一个地址,当我们传递的是'a'时,'a'的ASCII码值是97,那就是将97作为地址传参,strlen就会从97这个地址开始统计字符串长度,这就非法访问内存了,如果访问就会出现下面的情况

printf("%d\n", strlen(arr[1]));//err

解释:与上一条同理

printf("%d\n", strlen(&arr));//随机值

解释:&arr是数组的地址,数组的地址和数组首元素的地址,值是一样的,那么传递给strlen函数后,依然是从数组的第一个元素的位置开始往后统计直到/0结束

printf("%d\n", strlen(&arr + 1));//随机值

解释:与&arr类似,&arr+1是数组的地址加一,所以也是随机值

printf("%d\n", strlen(&arr[0] + 1));//随机值

解释:&arr[0] + 1是第二个元素的地址。结果也是随机值


题  三


1. char arr[] = "abcdef";//[a b c d e f \0]
2. printf("%d\n", sizeof(arr));//7
3. printf("%d\n", sizeof(arr + 0));//4/8
4. printf("%d\n", sizeof(*arr));//1
5. printf("%d\n", sizeof(arr[1]));//1
6. printf("%d\n", sizeof(&arr));//4/8
7. printf("%d\n", sizeof(&arr + 1));//4/8
8. printf("%d\n", sizeof(&arr[0] + 1));// 4/8

我们先看一下arr里面都有什么吧

解释如下

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

解释:arr中存储了7个char型色元素,所以为7

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

解释:arr + 0是首元素的地址,是地址,所以为4/8

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

解释:*arr其实就是首元素,1个字节。等价关系:*arr--> *(arr+0) -- arr[0]

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

解释:arr[1]是第二个元素,1个字节

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

解释:&arr是数组的地址,是地址就是4/8个字节

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

解释:&arr + 1是跳过一个数组的地址,是地址,所以为4/8

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

解释:&arr[0] + 1是第二个元素的地址,是地址,所以4/8


题  四


1. // char arr[] = "abcdef";//[a b c d e f \0]
2. // printf("%d\n", strlen(arr));//6
3. // printf("%d\n", strlen(arr + 0));//6
4. // printf("%d\n", strlen(*arr));//*arr为首元素,所以这里错误,err
5. // printf("%d\n", strlen(arr[1]));//arr[1]为第二个元素,所以这里也错误
6. // printf("%d\n", strlen(&arr));//6
7. // printf("%d\n", strlen(&arr + 1));//随机值
8. // printf("%d\n", strlen(&arr[0] + 1));//5

这题我就不一一解释了,各位宝子们结合下图与前面所讲.看懂本题是没有问题的

相关文章
|
2月前
|
JavaScript
js 解析 byte数组 成字符串
js 解析 byte数组 成字符串
68 5
|
1月前
|
人工智能 前端开发 JavaScript
拿下奇怪的前端报错(一):报错信息是一个看不懂的数字数组Buffer(475) [Uint8Array],让AI大模型帮忙解析
本文介绍了前端开发中遇到的奇怪报错问题,特别是当错误信息不明确时的处理方法。作者分享了自己通过还原代码、试错等方式解决问题的经验,并以一个Vue3+TypeScript项目的构建失败为例,详细解析了如何从错误信息中定位问题,最终通过解读错误信息中的ASCII码找到了具体的错误文件。文章强调了基础知识的重要性,并鼓励读者遇到类似问题时不要慌张,耐心分析。
|
1月前
|
Serverless 编译器 C语言
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
【C语言】指针篇- 深度解析Sizeof和Strlen:热门面试题探究(5/5)
|
3月前
|
SQL 存储 算法
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
恒生科技2022年9月24号数据ETL工程师岗位的笔试题目及答案汇总,包括了SQL选择题、SQL编程题和业务应用SQL编程题,涵盖了数据库基础知识、SQL语句编写以及数据仓库概念等多个方面。
60 2
【数据挖掘】恒生金融有限公司2023届秋招数据ETL工程师笔试题解析
|
3月前
|
机器学习/深度学习 自然语言处理 算法
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
2020年奇安信秋招算法方向试卷1的题目解析,覆盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、主题模型、采样方法、图像处理等多个领域的知识点。
48 1
【数据挖掘】2020奇安信秋招算法方向试卷1 笔试题解析
|
3月前
|
机器学习/深度学习 存储 算法
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
2020年奇安信秋招算法方向试卷3的题目解析,涵盖了数据结构、机器学习、深度学习、自然语言处理、排序算法、激活函数、PCA、词嵌入库等多个领域的知识点。
48 1
【数据挖掘】2020奇安信秋招算法方向试卷3 笔试题解析
|
3月前
|
存储 JavaScript 前端开发
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
一文带你深度解析:JavaScript中对象与数组的威力究竟有多大?
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0

推荐镜像

更多