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

目录

  • 一、前言
  • 二、一维数组
    • 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--7printf("%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));//数组名,计算整个数组的大小--48printf("%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/8printf("%d\n", sizeof(*(a + 1)));//计算的是第二行的大小-16printf("%d\n", sizeof(&a[0] + 1));//a[0]是第一行的数组名,&a[0]取出的就是数组的地址,4/8printf("%d\n", sizeof(*(&a[0] + 1)));//第二行,16printf("%d\n", sizeof(*a));//第一行--16printf("%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 5return 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);//00100001printf("%p\n", (unsigned int*)p + 0x1);//00100004return 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,-4return 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,5return 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);//atreturn 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验证运行结果

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于SpringBoot和VUE技术的智慧生活商城系统设计与实现

** &#x1f345;点赞收藏关注 → 私信领取本源代码、数据库&#x1f345; 本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路。&#x1f345;关注我不迷路&#x1f345;** 一、研究背景…

Net Core 使用Mongodb操作文件(上传,下载)

Net Core 使用Mongodb操作文件&#xff08;上传&#xff0c;下载&#xff09; 1.Mongodb GridFS 文件操作帮助类。 GridFS 介绍 https://baike.baidu.com/item/GridFS/6342715?fraladdin DLL源码&#xff1a;https://gitee.com/chenjianhua1985/mongodb-client-encapsulati…

STM32点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

论坛管理系统|基于Spring Boot+ Mysql+Java+B/S架构的论坛管理系统设计与实现(可运行源码+数据库+设计文档+部署说明+视频演示)

推荐阅读100套最新项目 最新ssmjava项目文档视频演示可运行源码分享 最新jspjava项目文档视频演示可运行源码分享 最新Spring Boot项目文档视频演示可运行源码分享 目录 目录 前台功能效果图 管理员功能登录前台功能效果图 用户功能模块 系统功能设计 数据库E-R图设计 l…

OxyPlot图表曲线图学习笔记(winform)

一、学习OxyPlot 开源地址&#xff1a;https://github.com/oxyplot/oxyplot 最新版&#xff1a;v2.1.2 新建winform&#xff0c;nuget中添加依赖包 二、写代码 2.1 BarSeries 2.2 ScatterSeries 2.3 LineSeries (带指向箭头&#xff09; int pointCount 50; double[] xs …

Xilinx 7系列FPGA的配置流程

目录 1.4配置流程 1.4.1 设备上电 ​编辑1.4.2 清除配置寄存器 1.4.3 采样模式引脚 1.4.4 同步 ​编辑1.4.5 检测设备ID ​编辑1.4.6 加载配置数据 1.4.7 CRC校验 1.4.8 启动序列 1.4配置流程 对于所有配置模式&#xff0c;7系列的基本配置流程都是相同的&…

C语言sizeof操作符与strlen函数

1.sizeof与strlen的介绍 (1).sizeof 计算变量的内存空间大小。底层实际上是对变量类型的计算。是一个单目操作符&#xff0c;不是函数&#xff0c;后面的括号可以省略 (2).strlen 函数原型 strlen是一个函数&#xff0c;返回的size_t类型的数据,头文件为string.h计算字符串…

Python爬虫:requests模块的基本使用

学习目标&#xff1a; 了解 requests模块的介绍掌握 requests的基本使用掌握 response常见的属性掌握 requests.text和content的区别掌握 解决网页的解码问题掌握 requests模块发送带headers的请求掌握 requests模块发送带参数的get请求 1 为什么要重点学习requests模块&…

如何在安卓端的SAP里配置打印机

1、转到 SPAD 事务&#xff08;“假脱机管理”屏幕&#xff09;。单击“设备/服务器”选项卡&#xff0c;输入输出设备的名称&#xff0c;然后点击显示按钮。 2、如果打印机已配置&#xff0c;它将显示设备属性、输出设备属性和纸盒信息的所有详细信息。如果输入新的打印机名称…

AndroidStudio设计登录页源码(音悦app)

目录 一、代码 二、效果 一、代码 1.在activity_main.xml里的代码 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas.android.com/apk/res/android"android:layout_width"match_parent&quo…

import gdal 报错

1.下载gdal https://www.lfd.uci.edu/~gohlke/pythonlibs/#gdal 2.安装正确版本 &#xff08;1&#xff09;查看python版本 python -v我的版本Python 3.7.9 建议下载 GDAL-3.4.2-cp37-cp37m-win_amd64.whl &#xff08;2&#xff09;放到Scripts文件夹下 执行 pip install GD…

mysql启动报错:ERROR! The server quit without updating PID file

mysql 重启或者启动时报错&#xff1a;ERROR! The server quit without updating PID file (/home/data/mysql/e787y33206.novalocal.pid).如下图: 重启报错&#xff1a; 启动也报错 这个错误是因为有mysql启动没有完全结束&#xff0c;如果是重启mysql服务&#xff0c;则在…

L2-035 完全二叉树的层序遍历(Python)

L2-035 完全二叉树的层序遍历 分数 25 全屏浏览 切换布局 作者 陈越 单位 浙江大学 一个二叉树&#xff0c;如果每一个层的结点数都达到最大值&#xff0c;则这个二叉树就是完美二叉树。对于深度为 D 的&#xff0c;有 N 个结点的二叉树&#xff0c;若其结点对应于相同深度…

超详细——VsCode连接远程主机/虚拟机并设置免密登录

超详细——VsCode连接远程主机/虚拟机并设置免密登录 文章目录 超详细——VsCode连接远程主机/虚拟机并设置免密登录[toc]连接到远程主机/虚拟机步骤1、打开vscode拓展 搜索 remote-ssh并安装步骤2、打开远程主机/虚拟机的ssh服务步骤3、设置连接远程主机的配置文件 设置免密登…

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

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

可以用SEO进行市场分析吗?(川圣SEO)蜘蛛池

baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; baidu搜索&#xff1a;如何联系八爪鱼SEO&#xff1f; SEO如何去进行关键词市场占比分析呢&#xff1f;可以进行市场分析吗&#xff1f; SEO&#xff0c;即搜索引…

Linux学习:权限

目录 1. shell命令的工作原理与存在意义1.1 shell命令解释器存在的意义1.2 shell解释器的工作原理 2. Linux操作系统&#xff1a;用户2.1 什么是用户2.2 用户的切换操作2.3 用户权限划分的意义 3. Linux中权限的种类和意义3.1 什么是权限3.2 sudo指令与短暂提权 4. 文件类型与文…

嵌入式3-12

1.整理思维导图 2.把上课没做完的结构体大小求完(写出过程) 3.把枚举部分的练习题&#xff0c;再做一遍 4.三种验证大小端存储大的代码写一遍 1.思维导图在最后 2.结构体大小 struct data{ 1233000044444444&#xff0c;16字节char t1; char t2; unsigned …

【PLIO学习总结】laserMapping中的时间戳与状态更新逻辑

本文仅用于个人学习总结记录。如有错误&#xff0c;请批评指正。 0、PLIO简要思路 从PLIO的论文中&#xff0c;可以知道&#xff0c;完整的PLIO算法采用IMU和LiDAR数据同时作为“输入”&#xff0c;维护状态变量包括加速度和角速度。 同时&#xff0c;PLIO是一种distortion-…

springboot266基于Web的农产品直卖平台的设计与实现

农产品直卖平台的设计与实现 摘 要 计算机网络发展到现在已经好几十年了&#xff0c;在理论上面已经有了很丰富的基础&#xff0c;并且在现实生活中也到处都在使用&#xff0c;可以说&#xff0c;经过几十年的发展&#xff0c;互联网技术已经把地域信息的隔阂给消除了&#x…