数组和指针笔试题目解析---掌握他们拿下指针魔鬼

目录

  • 一、前言
  • 二、一维数组
    • 2.1代码
    • 2.2分析
    • 2.3验证运行结果
  • 三、字符数组
    • 3.1代码1
      • 3.1.1分析
      • 3.1.2验证运行结果
    • 3.2代码2
      • 3.2.1分析
      • 3.2.2验证运行结果
    • 3.3代码3
      • 3.3.1分析
      • 3.3.2验证运行结果
    • 3.4代码4
      • 3.4.1分析
      • 3.4.2验证运行结果
    • 3.5代码5
      • 3.5.1分析
      • 3.5.2验证运行结果
    • 3.6代码6
      • 3.6.1分析
      • 3.6.2验证运行结果
  • 四、二维数组分析以及解释
  • 五、 指针运算笔试题解析
    • 5.1代码1
      • 5.1.1分析
      • 5.1.2验证运行结果
    • 5.2代码2
    • 5.3代码3
      • 5.3.1分析
      • 5.3.2验证运行结果
    • 5.4代码4
      • 5.4.1分析
      • 5.4.2验证运行结果
    • 5.5代码5
      • 5.5.1分析
      • 5.5.2验证运行结果
    • 5.6代码6
      • 5.6.1分析
      • 5.6.2验证运行结果
    • 代码7
      • 5.7.1分析
      • 5.7.2验证运行结果

一、前言

这些题目是关于数组和指针笔试的题目,建议在看解析之前认真想一想。

二、一维数组

2.1代码

#include<stdio.h>
int main()
{
	int a[] = { 1,2,3,4 };
	printf("%d\n", sizeof(a));
	printf("%d\n", sizeof(a + 0));
	printf("%d\n", sizeof(*a));
	printf("%d\n", sizeof(a + 1));
	printf("%d\n", sizeof(a[1]));
	printf("%d\n", sizeof(&a));
	printf("%d\n", sizeof(*&a));
	printf("%d\n", sizeof(&a + 1));
	printf("%d\n", sizeof(&a[0]));
	printf("%d\n", sizeof(&a[0] + 1));
	return 0;
}

2.2分析

讲这个之前先讲一下,数组名的意义:

  1. sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小。
  2. &数组名,这里的数组名表示整个数组,取出的是整个数组的地址。
  3. 除此之外所有的数组名都表示首元素的地址。
    在这里插入图片描述

2.3验证运行结果

在这里插入图片描述

三、字符数组

3.1代码1

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", sizeof(arr));
	printf("%d\n", sizeof(arr + 0));
	printf("%d\n", sizeof(*arr));
	printf("%d\n", sizeof(arr[1]));
	printf("%d\n", sizeof(&arr));
	printf("%d\n", sizeof(&arr + 1));
	printf("%d\n", sizeof(&arr[0] + 1));
	return 0;
}

3.1.1分析

在这里插入图片描述

3.1.2验证运行结果

在这里插入图片描述

3.2代码2

#include<stdio.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));
	printf("%d\n", strlen(arr + 0));
	printf("%d\n", strlen(*arr));
	printf("%d\n", strlen(arr[1]));
	printf("%d\n", strlen(&arr));
	printf("%d\n", strlen(&arr + 1));
	printf("%d\n", strlen(&arr[0] + 1));
	return 0;
}

3.2.1分析

在这里插入图片描述

3.2.2验证运行结果

在这里插入图片描述

3.3代码3

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
	return 0;
}

3.3.1分析

在这里插入图片描述

3.3.2验证运行结果

在这里插入图片描述

3.4代码4

#include<stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n", sizeof(arr));//计算的是数组的总大小,别忘了字符串还有给\0--7
	printf("%d\n", sizeof(arr + 0));//arr数组表示首元素地址,是地址就是4/8字节
	printf("%d\n", sizeof(*arr));//1字节
	printf("%d\n", sizeof(arr[1]));//1字节
	printf("%d\n", sizeof(&arr));//是地址就是4/8个字节
	printf("%d\n", sizeof(&arr + 1));//是地址就是4/8个字节
	printf("%d\n", sizeof(&arr[0] + 1));//是地址就是4/8个字节
	return 0;
}

3.4.1分析

在这里插入图片描述

3.4.2验证运行结果

在这里插入图片描述

3.5代码5

#include<stdio.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));
	printf("%d\n", sizeof(p + 1));
	printf("%d\n", sizeof(*p));
	printf("%d\n", sizeof(p[0]));
	printf("%d\n", sizeof(&p));
	printf("%d\n", sizeof(&p + 1));
	printf("%d\n", sizeof(&p[0] + 1));
	return 0;
}

3.5.1分析

在这里插入图片描述

3.5.2验证运行结果

在这里插入图片描述

3.6代码6

#include<stdio.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", strlen(p));
	printf("%d\n", strlen(p + 1));
	printf("%d\n", strlen(*p));
	printf("%d\n", strlen(p[0]));
	printf("%d\n", strlen(&p));
	printf("%d\n", strlen(&p + 1));
	printf("%d\n", strlen(&p[0] + 1));
	return 0;
}

3.6.1分析

在这里插入图片描述

3.6.2验证运行结果

在这里插入图片描述

四、二维数组分析以及解释

#include<stdio.h>
int main()
{
	int a[3][4] = { 0 };
	printf("%d\n", sizeof(a));//数组名,计算整个数组的大小--48
	printf("%d\n", sizeof(a[0][0]));//是第一行第一个元素大小是4字节
	printf("%d\n", sizeof(a[0]));//是第一行的数组名,大小是16个字节
	printf("%d\n", sizeof(a[0] + 1));//--a[0][1]的地址,大小是4字节
	printf("%d\n", sizeof(*(a[0] + 1)));//第一行第二个元素,大小就是4字节
	printf("%d\n", sizeof(a + 1));//a是首元素的地址,也就是第一行的地址,a+1就是第二行的地址,4/8
	printf("%d\n", sizeof(*(a + 1)));//计算的是第二行的大小-16
	printf("%d\n", sizeof(&a[0] + 1));//a[0]是第一行的数组名,&a[0]取出的就是数组的地址,4/8
	printf("%d\n", sizeof(*(&a[0] + 1)));//第二行,16
	printf("%d\n", sizeof(*a));//第一行--16
	printf("%d\n", sizeof(a[3]));//是第四行的数组名,单独放在sizeof内部,计算的是第四行的大小,16字节
	return 0;
}

五、 指针运算笔试题解析

5.1代码1

#include <stdio.h>
int main()
{
 int a[5] = { 1, 2, 3, 4, 5 };
 int *ptr = (int *)(&a + 1);
 printf( "%d,%d", *(a + 1), *(ptr - 1));//2 5
 return 0;
}

5.1.1分析

在这里插入图片描述

5.1.2验证运行结果

在这里插入图片描述

5.2代码2

//在X86环境下
//假设结构体的大小是20个字节
//程序输出的结构是啥?

truct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{
	printf("%p\n", p + 0x1);//00100014
	//指针加减整数
	printf("%p\n", (unsigned long)p + 0x1);//00100001
	printf("%p\n", (unsigned int*)p + 0x1);//00100004
	return 0;
}

5.3代码3

#include <stdio.h>
int main()
{
 int a[3][2] = { (0, 1), (2, 3), (4, 5) };
 int *p;
 p = a[0];
 printf( "%d", p[0]);
 return 0;
}

5.3.1分析

因为数组内是逗号表达书,所以数组化简得到a[3][2]={1,2,3}
又因为是二维数组,所以p[0]是第一行首元素为1

5.3.2验证运行结果

在这里插入图片描述

5.4代码4

//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{
 int a[5][5];
 int(*p)[4];
 p = a;
 printf( "%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//FFFFFFFFFFFFFFFC,-4
 return 0;
}

5.4.1分析

在这里插入图片描述

5.4.2验证运行结果

在这里插入图片描述

5.5代码5

#include <stdio.h>
int main()
{
 int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
 int *ptr1 = (int *)(&aa + 1);
 int *ptr2 = (int *)(*(aa + 1));
 printf( "%d,%d", *(ptr1 - 1), *(ptr2 - 1));//10,5
 return 0;
}

5.5.1分析

在这里插入图片描述

5.5.2验证运行结果

在这里插入图片描述

5.6代码6

#include <stdio.h>
int main()
{
 char *a[] = {"work","at","alibaba"};
 char**pa = a;
 pa++;
 printf("%s\n", *pa);//at
 return 0;
}

5.6.1分析

在这里插入图片描述

5.6.2验证运行结果

在这里插入图片描述

代码7

#include <stdio.h>
int main()
{
 char *c[] = {"ENTER","NEW","POINT","FIRST"};
 char**cp[] = {c+3,c+2,c+1,c};
 char***cpp = cp;
 printf("%s\n", **++cpp);
 printf("%s\n", *--*++cpp+3);
 printf("%s\n", *cpp[-2]+3);
 printf("%s\n", cpp[-1][-1]+1);
 return 0;
}

5.7.1分析

在这里插入图片描述

5.7.2验证运行结果

在这里插入图片描述
在这里插入图片描述
欧耶!!!!我学会啦!!!!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452759.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

D7805 ——体积小,成本低,性能好

D7805 构成的 5V 稳压电源为输出电压5V&#xff0c;输出电流 1000mA 的稳压电源它由滤波电容 C1,C3,防止自激电容 C2、C3 和一只固定三端稳压器&#xff08;7805&#xff09;后级加 LC 滤波极为简洁方便地搭成&#xff0c;输入直流电压范围为 7~35V&#xff0c;此直流电压经过D…

机械女生,双非本985硕,目前学了C 基础知识,转嵌入式还是java更好?

作为单片机项目开发的卖课佬&#xff0c;个人建议&#xff0c;先转嵌入式单片机开发方向&#xff0c;哈哈。 java我也学过&#xff0c;还学过oracle、mysql数据库&#xff0c;只是当时没做笔记&#xff0c;找不好充分的装逼证据了。 从实习通过业余时间&#xff0c;学到快正式毕…

(黑马出品_高级篇_03)SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式

&#xff08;黑马出品_高级篇_03&#xff09;SpringCloudRabbitMQDockerRedis搜索分布式 微服务技术——多级缓存 今日目标1.什么是多级缓存2.JVM进程缓存2.1.导入案例2.1.1.安装MySQL2.1.1.1.准备目录2.1.1.2.运行命令2.1.1.3.修改配置 2.1.1.4.…

学编程前需要知道哪些编程语言呢?

编程语言的选择对学习编程的重要性不可低估。不同编程语言各有独特特点和适用场景&#xff0c;合理选择适合自身需求的编程语言能事半功倍。初学者而言&#xff0c;选择一门简洁易读的编程语言如Python&#xff0c;可以快速掌握编程基础原理&#xff0c;轻松编写程序&#xff0…

202003 青少年软件编程(Scratch)等级考试试卷(二级)

第1题:【 单选题】 在以下积木中,( )可以将声音的音量增大 A: B: C: D: 【正确答案】: B 【试题解析】 : 第2题:【 单选题】 如下图所示脚本运行的结果是( ) A:画一条直线 B:画一个三角形 C:画一个圆形 D:画一条虚线 【正确答案】: D 【试题解析】 : 第3…

【新书推荐】26.3 模块间的信息传递

模块间的信息传递主要表现为模块间过程调用时的参数传递。在第十一章介绍的过程调用参数传递原则和方法依然有效。少量的参数可以利用寄存器传递或堆栈传递&#xff0c;大量的参数可先组织在一个缓冲区中&#xff0c;然后利用寄存器或堆栈传递相应的指针。 如果利用约定的存储…

ES分片均衡策略分析与改进

从故障说起 某日早高峰收到 Elasticsearch 大量查询超时告警&#xff0c;不同于以往&#xff0c;查看 Elasticsearch 查询队列监控后发现&#xff0c;仅123节点存在大量查询请求堆积。 各节点查询队列堆积情况 查看节点监控发现&#xff0c;123节点的 IO 占用远高于其他节点。…

CcFrame Logo完成

Compact celerity framework CCFrame&#xff1a;一个快速开发、精简压缩的SAAS微服务后端架构 仅需要一台阿里云2核2G机器即可完整运行平台系统及其所有的运行及数据支持 微服务、远程-本地二级缓存架构、ES索引、队列、分库分表、集群定时器&#xff0c;一个都不能少 谁说2…

基于YOLOv8深度学习的木薯病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【R语言实战】——fGARCH包在金融时序上的模拟应用

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

【惠友小课堂】健康开学第一课,青少年脊柱侧弯了解一下?让孩子少走“弯”路

寒假结束迎来开学&#xff0c;家长们又开始了新一轮的“内卷”之旅&#xff0c;可在关心学业的同时&#xff0c;千万不能忽略孩子们的身体健康&#xff0c;脊柱侧弯已成为继肥胖症、近视之后我国儿童青少年的第三大健康“杀手”。 至于引起脊柱侧弯的原因&#xff0c;可能很多家…

安装Android Studio遇到Unable to access Android SDK add-on list的错误

第一次安装android studio的时候&#xff0c;提示&#xff1a;unable to access Android sdk add-on list 解决办法 这个错误一般是android studoi代理没有设置导致的&#xff0c;需要在setting里面设置&#xff1a; 点击Android Studio - Preferences&#xff0c;在 Appeara…

【Java设计模式】十八、观察者模式

文章目录 1、观察者模式2、案例&#xff1a;模拟微信公众号3、总结4、在源码中的实际应用 1、观察者模式 发布订阅模式&#xff0c;一对多&#xff0c;让多个观察者对象同时监听某一个主题对象。主题对象状态发生变化时&#xff0c;通知所有的观察者对象&#xff0c;让它们自动…

SpringBoot功能模块之实现单文件、多文件上传和下载

一、单文件上传 1.1MultipartFile MultipartFile 是 Spring 框架中的一个接口&#xff0c;主要用于处理 HTTP 请求中的文件上传。它提供了一些方法来获取上传文件的信息和内容。 以下是 MultipartFile 的一些主要方法&#xff1a; getOriginalFilename()&#xff1a;返回上…

vue 实现滚动导航

效果 实现 css 使用了 unocss 使界面滚动到给定元素的指定坐标位置 window.scrollTo({ top: 0 })使用了内边距避免最后数据高度不够 <main class"pb-100vh"></main>完整代码 <script lang"ts" setup> defineOptions({ name: DemoVi…

掌握Go语言:深入encoding/gob包的高效数据序列化

掌握Go语言&#xff1a;深入encoding/gob包的高效数据序列化 引言理解Gob和它的使用场景Gob的概念和设计目标Gob的适用场景和优势 开始使用Gob基本的Gob编码和解码示例代码编码&#xff08;序列化&#xff09;解码&#xff08;反序列化&#xff09; Gob编码高级应用自定义类型的…

Minecraft 1.20.1 Forge服务器保姆级搭建教程 (使用mcsm面板 | 两种启动方式)

MC Forge 服务器部署 使用 Linux 云服务器部署 Minecraft 1.20.1 Forge 服务器 目录 MC Forge 服务器部署看这篇教程之前&#xff0c;你需要准备好这篇教程的目标前期准备1. 环境需求&#xff1a;腾讯云、CentOS 7.9&#xff08;对于其他云服务商和 Linux 系统&#xff0c;操作…

[vscode]使用cmake时将命令行参数传递给调试目标

一、简介 本文介绍了在vscode中使用cmake工具时&#xff0c;如何传递参数给编译目标的方法。 前提&#xff1a;使用vscodecmake编译C/C程序。 二、方法 在.vscode/目录下新建settings.json文件&#xff0c;并将待传底的参数写在 cmake.debugConfig里。 下面介绍了一个示例&a…

重磅!2014-2023七大顶刊中国学者排行榜出炉,施一公、颜宁位列前二

在科学领域&#xff0c;Cell、Nature和Science被公认为最顶尖的期刊&#xff0c;简称CNS。而在医学方面&#xff0c;新英格兰医学杂志(NEJM)、柳叶刀(Lancet)、美国医学会杂志(JAMA)以及英国医学期刊(BMJ)被誉为“四大医学顶刊”。这七大期刊上发表的论文&#xff0c;往往被看作…

平台工程:构建企业数字化转型的基石

有人说&#xff0c;平台工程&#xff08;Platform Engineering&#xff09;&#xff0c;不过是新瓶装旧酒&#xff08;DevOps&#xff09;。 而Gartner 将平台工程列为 2024 顶级战略技术趋势之一。我国信通院也开始陆续制定与平台工程相关的技术标准。 随着数字化浪潮的席卷…