指针和数组笔试题的透析
指针---进阶篇(三)
- 一、前言
- 二、一维数组例题透析:
- 三、指针笔试题
- 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控制模块时序分析…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
UE5 学习系列(三)创建和移动物体
这篇博客是该系列的第三篇,是在之前两篇博客的基础上展开,主要介绍如何在操作界面中创建和拖动物体,这篇博客跟随的视频链接如下: B 站视频:s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...
Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...
手机平板能效生态设计指令EU 2023/1670标准解读
手机平板能效生态设计指令EU 2023/1670标准解读 以下是针对欧盟《手机和平板电脑生态设计法规》(EU) 2023/1670 的核心解读,综合法规核心要求、最新修正及企业合规要点: 一、法规背景与目标 生效与强制时间 发布于2023年8月31日(OJ公报&…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
