指针和数组笔试题的透析
指针---进阶篇(三)
- 一、前言
- 二、一维数组例题透析:
- 三、指针笔试题
- 1.例一:
- 2.例二:
- 3.例三:
- 4.例四:
- 5.例五:
- 6.例六:
一、前言
那么好了好了,宝子们,从今天开始开始总结暑假博客,从指针开始,后续,来吧开始整活!⛳️
二、一维数组例题透析:
关于数组名的理解:
arr,首先数组名是数组首元素的地址 毋庸置疑
&arr,取地址符号加上数组名取出的是整个数组的地址
但是有2个例外:
1.sizeof后面括号内只有数组名的话,计算的是整个数组的大小单位是字节。
2.&加上数组名,取出的是整个数组的地址
还有一点特别需要注意:
只要是指针也就是地址,它的大小必然是4或8个字节,4/8个字节的原因是在不同的环境下x86和x64。
1.int a[ ] = { 1,2,3,4 };
#include <stdio.h>
int main()
{int a[] = { 1,2,3,4 };printf("%d\n", sizeof(a));//计算的是整个数组的大小:4*4=16printf("%d\n", sizeof(a+0));//sizeof(a+0)得到的是数组首元素的地址:4/8printf("%d\n", sizeof(*a));//a是数组首元素的地址,*(解引用后)便是数组首元素:1,大小为:4printf("%d\n", sizeof(a+1));// Sizeof(a)是数组首元素地址,加1,也就是数组第2个元素的地址,只要是地址,它的大小就是4/8个字节printf("%d\n", sizeof(a[1]));//数组的下标访问,不必多说,直接就是:4printf("%d\n", sizeof(&a));//这里不要被表面现象所迷惑了,&a取出的是整个数组的地址,它本质上还是个地址,所以说只要是地址它的字节大小就是:4/8printf("%d\n", sizeof(*&a));//*和&可以说是抵消了,所以说本质上还是sizeof(a)一样的。计算的是整个数组的大小:4*4=16printf("%d\n", sizeof(&a+1));//&a取的是整个数组的地址加1,也就是跳过了整个数组,本质上他还是个地址,所以说还是4/8个字节printf("%d\n", sizeof(&a[0]));//他取出的是数组首元素的地址,4/8个字节printf("%d\n", sizeof(&a[0]+1));//取出的是数组首元素的地址,然后加1,也就是取出的是数组中第2个元素的地址:4/8个字节return 0;
}
2.char arr[ ] = { ‘a’,‘b’,‘c’,‘d’,‘e’,‘f’};
int main()
{char arr[] = { 'a','b','c','d','e','f'};printf("%d\n", sizeof(arr));//因为sizeof内部的括号只有arr,arr代表整个数组的大小:1*6printf("%d\n", sizeof(arr+0));//4/8printf("%d\n", sizeof(*arr));//这里的arr是数组首元素地址,*后就是数组首元素大小为:1个字节printf("%d\n", sizeof(arr[1]));//1printf("%d\n", sizeof(&arr));//取出的是整个数组的地址,地址的大小只有4/8printf("%d\n", sizeof(&arr+1));//4/8printf("%d\n", sizeof(&arr[0]+1));//4/8//声明:strlen接收的参数类型是(指针):const char * str//strlen函数只有遇到‘\0’为结束标志printf("%d\n", strlen(arr));//随机值因为上面这个数组里面没有'\0',所以strlen要不断的往下遍历,直到遇到'\0'为止。printf("%d\n", strlen(arr + 0));//随机值printf("%d\n", strlen(*arr)); // error,arr是数组首元素的地址, * arr就是数组首元素,就是'a' - 97//strlen函数参数的部分需要传一个地址当我们传递的是"a"时,'a"的ASCII码值是97,那就是将97作为地址传参//strLen就会从97这个地址开始统计字符串长度,这就非法访问内存了printf("%d\n", strlen(arr[1]));//errorprintf("%d\n", strlen(&arr));//随机值printf("%d\n", strlen(&arr+1));//随机值printf("%d\n", strlen(&arr[0]+1));//从第二个元素的地址开始访问,还是随机值
3.char arr[ ] = “abcdef”;
char arr[] = "abcdef";printf("%d\n", sizeof(arr));//因为还有'\0'所以=1*7=7printf("%d\n", sizeof(arr + 0));//首元素的地址:4/8printf("%d\n", sizeof(*arr));//对数组首元素地址*,也就是第1个元素a:1printf("%d\n", sizeof(arr[1]));//1printf("%d\n", sizeof(&arr));//整个数组的地址:4/8printf("%d\n", sizeof(&arr + 1));//4/8printf("%d\n", sizeof(&arr[0] + 1));//4/8printf("%d\n", strlen(arr));//6printf("%d\n", strlen(arr + 0));//6printf("%d\n", strlen(*arr));//errorprintf("%d\n", strlen(arr[1]));//errorprintf("%d\n", strlen(&arr));//整个数组的地址:6printf("%d\n", strlen(&arr + 1));//取出整个数组的地址加1,相当于指针这个数组指向最后一位的后面,随机值printf("%d\n", strlen(&arr[0] + 1));//从b开始,:5个
4.char* p = “abcdef”;
char* p = "abcdef";printf("%d\n", sizeof(p));//4/8 :p是一个指针变量printf("%d\n", sizeof(p+1));//4/8 :p+1是'b'的地址,是地址大小就是4/8个字节 printf("%d\n", sizeof(*p));//1 :就是aprintf("%d\n", sizeof(p[0]));//1 :就是aprintf("%d\n", sizeof(&p));//4/8 :取出的是整个字符串的地址: char**printf("%d\n", sizeof(&p + 1));//4/8 :char**printf("%d\n", sizeof(&p[0] + 1));//4/8 :&p[0] + 1得到是'b'的地址printf("%d\n", strlen(p));//6printf("%d\n", strlen(p + 1));// 5 printf("%d\n", strlen(*p));//errorprintf("%d\n", strlen(p[0]));//errorprintf("%d\n", strlen(&p));//随机值printf("%d\n", strlen(&p + 1));//随机值printf("%d\n", strlen(&p[0] + 1));//5
5.二维数组:int a[3][4] = { 0 };
//二维数组int a[3][4] = { 0 };printf("%d\n", sizeof(a));// a是数组名计算的,是整个数组的大小:3*4*4=48;printf("%d\n", sizeof(a[0][0]));//第1行第1个元素的大小:4printf("%d\n", sizeof(a[0]));//这里我们把a[0]看作一个一维数组的数组名:4*4=16printf("%d\n", sizeof(a[0]+1));//a[0]作为第一行的数组名,没有单独放在sizeo内部,没有&//a[0]表示数组首元素的地址,也就是a[0][0]的地址 所以a[0]+1是第一行第二个元素的地址,是地址就是4/8个字节printf("%d\n", sizeof(*a[0]+1));//4 //计算的是就是第一行第2个元素的大小printf("%d\n", sizeof(a+1));// a不是单独放在size of内部就代表数组首元素地址也就是第1行数组的地址,加1,也就是第2行数组的地址:4/8printf("%d\n", sizeof(*(a+1)));//对第2行数组地址* 就是4*4=16printf("%d\n", sizeof(&a[0] + 1));//因为a[0]是第一行数组的数组名,对第1行数组数组名取地址之后再加1,也就是第2行数组的地址:4/8printf("%d\n", sizeof(*(&a[0] + 1)));//对第2行数组地址整个*,4*4=16printf("%d\n", sizeof(*a));//如果a不是单独放在size of内部,那么a就代表数组首元素地址,也就是数组第1行的地址 *后=4*4=16printf("%d\n", sizeof(a[3]));//a[3]代表第三行数组数组名:4*4=16
对二维数组的深度理解:
三、指针笔试题
1.例一:
int main()
{int a[5] = { 1,2,3,4,5 };int* ptr = (int*)(&a + 1);//取地址加数组名(& a),取出的是整个数组的地址,再+1指向5的后面!!!printf("%d %d", *(a + 1), *(ptr - 1));//a+1:就是数字数元素地址加1,然后*后就是2;//刚开始ptr指的是5的后面,再减1就是指向了5return 0;
}
2.例二:
这道题主要考察的是:指针类型:决定了指针+1到底加几?
//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}* p = (struct Test*)0x100000;//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{printf("%p\n", p + 0x1);//0x100000+1:因为p是一个结构体指针,结构体指针+1跳的是整个结构体,也就是加了20个字节//0x100000+20?错!因为0x100000是16进制的:0x100014printf("%p\n", (unsigned long)p + 0x1);//在这里我们把结构体指针强制类型转化为无符号的数字:+1=0x100001printf("%p\n", (unsigned int*)p + 0x1);//这里我们把结构体指针,p强制类型转化为int*,+1就跳过4个字节:0x100004return 0;
}
注意前提:环境为X86:
3.例三:
int main()
{int a[4] = { 1, 2, 3, 4 };int* ptr1 = (int*)(&a + 1);int* ptr2 = (int*)((int)a + 1);printf("%x,%x", ptr1[-1], *ptr2);//ptr1:=4;// a是数组首元素地址,把a数组首元素地址强制转换为int整型,强制转化为int整型之后再+1就是单纯的加数字1了,之后再将这个数字强制转化为int*。//打印的是地址:return 0;
}
4.例四:
考察:逗号表达式!
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };//不要被表面现象所迷惑了,如果012345要存到二维数字中,它每个数组都要用大括号括起来,//而它是用小括号,所以说它是一个逗号表达式,所以说实际上存进去的只有1 3 5这三个数字后面其他的都是0int* p;p = a[0];//a[0]之前不是讲过了吗?是第1行数组的数组名:也就是第1行数组首元素的地址。printf("%d", p[0]);//1return 0;
}
5.例五:
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));//1.ptr1:取地址&+数组名aa是取出了整个数组的地址,再加一就是跳过整个二维数组。-1指向了10//2.ptr2:aa是数组首元素地址,在二维数组中,我们把每一行看作一个元素,+1的话就是跳过了第1行,指向了第2行首元素的地址,-1指向了5return 0;
}
6.例六:
需要画图,才能一目了然!
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;
}
好了,今天的分享就到这里了
如果对你有帮助,记得点赞👍+关注哦!
我的主页还有其他文章,欢迎学习指点。关注我,让我们一起学习,一起成长吧!
相关文章:

指针和数组笔试题的透析
指针---进阶篇(三) 一、前言二、一维数组例题透析:三、指针笔试题1.例一:2.例二:3.例三:4.例四:5.例五:6.例六: 一、前言 那么好了好了,宝子们,从…...

「UG/NX」Block UI 超级点SuperPoint
✨博客主页何曾参静谧的博客📌文章专栏「UG/NX」BlockUI集合📚全部专栏「UG/NX」NX二次开发「UG/NX」BlockUI集合「VS」Visual Studio「QT」QT5程序设计「C/C+&#...
Linux——kafka常用命令
一、Kafka的常用命令包括: 1. 启动Zookeeper服务 前台启动: ./bin/zookeeper-server-start.sh config/zookeeper.properties 后台启动: ./bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 2. 停止Zookeeper服务 .…...

GLTF编辑器如何快速重置模型原点
1、什么是模型原点? 模型原点是三维建模中的概念,它是指在一个虚拟三维空间中确定的参考点。模型原点通常位于模型的几何中心或基本组件的中心位置。如图所示: 可以看到模型的原点在模型的几何中心 2、模型原点的作用 知道了什么是模型原点&…...

【STL】vector常见用法及模拟实现(附源码)
目录 前言1. vector介绍及使用1.1vector的介绍1.2 vector的使用1.2.1 构造函数 1.2.2 vector对象遍历1.2.3 reserve和resize1.2.4 insert和erase 2. vector模拟实现2.1 vector迭代器失效问题2.2 模拟实现reserve函数浅拷贝问题2.3模拟实现源码2.3.1 vector.h2.3.2 test.cpp 前言…...
深度学习保姆级教学
文章目录 前言1.深度学习概论2.神经网络1.基础原理2.损失函数3.SoftMax4.前向传播5.反向传播1.反向传播介绍 6 卷积神经网络应用1.检测任务2.超分辨率重构3.医学检测4.无人驾驶5. 人脸识别 6.卷积网络和传统区别7.卷积神经网络1.卷积做了什么?2.节点网络1.Alexnet2.…...
计算机视觉的优势和挑战
计算机视觉(CV)是一项快速发展的技术,它具有许多优势和挑战。以下是一些可能的例子: 优势: 1. 自动化:CV技术可以自动化任务,例如图像分类、目标检测和跟踪,从而提高生产力和减少人…...

群晖管家+内网穿透实现公网远程访问本地黑群晖
白嫖怪狂喜!黑群晖也能使用群晖管家啦! 文章目录 白嫖怪狂喜!黑群晖也能使用群晖管家啦!1.使用环境要求:2.下载安装群晖管家app3.随机地址登陆群晖管家app4.固定地址登陆群晖管家app 自己组装nas的白嫖怪们虽然也可以通…...
Essential C++【读书笔记 思考总结】
本篇博客是学习过程中的笔记、思考和总结。原文链接: 3 泛型编程风格 Generic Programming3.1 指针的算术运算3.2 了解 Iterator(泛型指针)3.3 所有容器的共通操作 3 泛型编程风格 Generic Programming STL的主要组件:Container&…...

深度学习实战基础案例——卷积神经网络(CNN)基于Xception的猫狗识别|第2例
文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例,我的环境具体如下: …...
Linux Systemd 配置开机自启
博文目录 文章目录 Systemd操作方式配置方式配置示例参考 Systemd Systemd 是一个用于启动、管理和监控 Linux 系统的初始化系统。它是许多现代 Linux 发行版中默认的初始化系统,取代了传统的 SysVinit 和 Upstart。 Systemd 的引入在 Linux 社区引起了一些争议&…...

华为云云耀云服务器L实例评测|轻量级应用服务器对决:基于 fio 深度测评华为云云耀云服务器L实例的磁盘性能
本文收录在专栏:#云计算入门与实践 - 华为云 专栏中,本系列博文还在更新中 相关华为云云耀云服务器L实例评测文章列表如下: 华为云云耀云服务器L实例评测 | 从零开始:云耀云服务器L实例的全面使用解析指南华为云云耀云服务器L实…...

卸载Visual Studio 2010学习版 —— 卸载VCExpress
目录 最初安装Visual Studio 2010学习版是因为计算机二级 C语言考试而装,现如今考完试后便可卸载掉了,安装简便而卸载却没有uninstall.exe文件。故本文提供卸载方式。 进入到程序目录,找到setup.exe文件,也可以在程序目录搜索set…...

react的状态管理简单钩子方法
1.recoil useProvider文件: import { atom, useRecoilState } from recoil;const initState atom({key: initState,default: {state: [],}, })// 将业务逻辑拆分到一个单独文件中,方便进行状态管理 export interface StateProps {id: number;text: string;isFini…...

【Git】轻松学会 Git:深入理解 Git 的基本操作
文章目录 前言一、创建 Git 本地仓库1.1 什么是仓库1.2 创建本地仓库1.3 .git 目录结构 二、配置 Git三、认识 Git 的工作区、暂存区和版本库3.1 什么是 Git 的工作区、暂存区和版本库3.2 工作区、暂存区和版本库之间的关系 四、添加文件4.1 添加文件到暂存区和版本库中的命令4…...

什么是HTTP头部(HTTP headers)?
聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 理解 HTTP 头部(HTTP Headers)⭐ HTTP 头部的分类⭐ HTTP 头部的应用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦&#x…...

SpringCloud Alibaba 入门到精通 - Sentinel
SpringCloud Alibaba 入门到精通 - Sentinel 一、基础结构搭建1.父工程创建2.子工程创建 二、Sentinel的整合SpringCloud1.微服务可能存在的问题2.SpringCloud集成Sentinel搭建Dashboard3 SpringCloud 整合Sentinel 三、服务降级1 服务降级-Sentinel2 Sentinel 整合 OpenFeign3…...

【深度学习实验】前馈神经网络(三):自定义多层感知机(激活函数logistic、线性层算Linear)
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入必要的工具包 1. 构建数据集 2. 激活函数logistic 3. 线性层算子 Linear 4. 两层的前馈神经网络MLP 5. 模型训练 一、实验介绍 本实验实现了一个简单的两层前馈神经网络 激活函数…...
HJ68 成绩排序
描述 给定一些同学的信息(名字,成绩)序列,请你将他们的信息按照成绩从高到低或从低到高的排列,相同成绩 都按先录入排列在前的规则处理。 例示: jack 70 peter 96 Tom 70 smith 67 从高到低…...

FPGA——UART串口通信
文章目录 前言一、UART通信协议1.1 通信格式2.2 MSB或LSB2.3 奇偶校验位2.4 UART传输速率 二、UART通信回环2.1 系统架构设计2.2 fsm_key2.3 baud2.4 sel_seg2.5 fifo2.6 uart_rx2.7 uart_tx2.8 top_uart2.9 发送模块时序分析2.10 接收模块的时序分析2.11 FIFO控制模块时序分析…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题
在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件,这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下,实现高效测试与快速迭代?这一命题正考验着…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学
一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件,其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时,价带电子受激发跃迁至导带,形成电子-空穴对,导致材料电导率显著提升。…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...

【阅读笔记】MemOS: 大语言模型内存增强生成操作系统
核心速览 研究背景 研究问题:这篇文章要解决的问题是当前大型语言模型(LLMs)在处理内存方面的局限性。LLMs虽然在语言感知和生成方面表现出色,但缺乏统一的、结构化的内存架构。现有的方法如检索增强生成(RA…...

Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用
Linux 内存管理调试分析:ftrace、perf、crash 的系统化使用 Linux 内核内存管理是构成整个内核性能和系统稳定性的基础,但这一子系统结构复杂,常常有设置失败、性能展示不良、OOM 杀进程等问题。要分析这些问题,需要一套工具化、…...

以太网PHY布局布线指南
1. 简介 对于以太网布局布线遵循以下准则很重要,因为这将有助于减少信号发射,最大程度地减少噪声,确保器件作用,最大程度地减少泄漏并提高信号质量。 2. PHY设计准则 2.1 DRC错误检查 首先检查DRC规则是否设置正确,然…...