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

目录

  • 一、前言
  • 二、一维数组
    • 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…

C++中的操作符

C中的操作符 :: 在C中&#xff0c;双冒号::被称为作用域解析操作符&#xff08;Scope Resolution Operator&#xff09;。它用于指定一个标识符&#xff08;如变量名、函数名、类型名&#xff09;的作用域。这个操作符主要用于以下几个方面&#xff1a; 1. 访问全局变量 当…

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…

【WEEK2】学习目标及总结【SpringMVC】【中文版】

学习目标&#xff1a; 三周完成SpringMVC入门——第二周 学习内容&#xff1a; 参考视频教程【狂神说Java】SpringMVC最新教程IDEA版通俗易懂使用注释完成MVC程序Controller控制器RestFul风格结果跳转方式数据处理 学习时间及产出&#xff1a; 第二周 MON~FRI 2024.3.4 【W…

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 …

知识图谱详细建立过程

开始建立知识图谱&#xff1a; 确定知识图谱的范围&#xff1a; 首先&#xff0c;确定你的知识图谱将涵盖的主题范围。樱桃种植涉及到哪些方面&#xff1f;可能包括樱桃的生长周期、品种、栽培技术、土壤和气候要求、病虫害防治、收获和加工等方面。 收集樱桃种植相关的数据&a…

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模块&…

关于k8s中 storageclass 的 is-default-sc 默认存储设置

为什么要改变默认存储类&#xff1f; 取决于安装模式&#xff0c;你的 Kubernetes 集群可能和一个被标记为默认的已有 StorageClass 一起部署。 这个默认的 StorageClass 以后将被用于动态的为没有特定存储类需求的 PersistentVolumeClaims 配置存储。更多细节请查看 Persiste…

MySQL—InnoDB在RC隔离级别下如何处理事务读取操作

本文将探讨InnoDB在读已提交&#xff08;Read Committed&#xff09;隔离级别下如何处理事务读取操作的原理。这个过程是InnoDB多版本并发控制&#xff08;MVCC&#xff09;机制的一个关键组成部分&#xff0c;旨在提供高效的事务隔离&#xff0c;同时减少锁的需求&#xff0c;…

如何在安卓端的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…

js手写Promise.prototype.finally

实现 Promise.prototype.finally 前面的promise不管成功还是失败&#xff0c;都会走到finally中&#xff0c;并且finally之后&#xff0c;还可以继续then&#xff08;说明它还是一个then方法是关键&#xff09;&#xff0c;并且会将初始的promise值原封不动的传递给后面的then.…

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、设置连接远程主机的配置文件 设置免密登…