指针和数组笔试题的透析
指针---进阶篇(三)
- 一、前言
- 二、一维数组例题透析:
- 三、指针笔试题
- 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控制模块时序分析…...
在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:
在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档,…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
爬虫基础学习day2
# 爬虫设计领域 工商:企查查、天眼查短视频:抖音、快手、西瓜 ---> 飞瓜电商:京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空:抓取所有航空公司价格 ---> 去哪儿自媒体:采集自媒体数据进…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...
Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...
