指针运算典型例题解析
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));
return 0;
}
解析:
运行结果:
2.题目2
在X86(32位)环境下,假设结构体的大小是20个字节,程序输出的结构是啥?
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{printf("%p\n", p + 0x1);printf("%p\n", (unsigned long)p + 0x1);printf("%p\n", (unsigned int*)p + 0x1);return 0;
}
解析:
考察的是“指针+-整数”的问题
+0x1就是结构体指针+1,要跳过一个结构体,结构体的大小是20个字节,所以就是+20字节 —— 如果是10进制则是:0x100020,但是现在是16进制,所以是0x100014
p 强制转换为 unsigned long,不是指针类型了,整型值+1,就是+1,所以是0x100001
unsigned int* 强制转换为,无符号整型的指针,+1是跳过一个整型的4个字节,所以是0x100004
运行结果:
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;
}
解析:
调试一下,观察一下a中的内容:
不是:
0 | 1 |
2 | 3 |
4 | 5 |
的原因是因为:
int a[3][2] = { (0, 1), (2, 3), (4, 5) };
不是:
int a[3][2] = { {0, 1}, {2, 3}, {4, 5} };
所以,按照逗号表达式计算括号中保留了:1,3,5. 又因为是3行两列的,所以用 0 补位。
a[0] 是第一行的数组名,数组名表示首元素的地址,其实就是&a[0][0]
p[0] —— *(p + 0)——*p —— 1
运行结果:
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]);
return 0;
}
解析:
考察的是指针 - 指针,其结果的绝对值是指针和指针之间的元素个数。
a 是二维数组
p 是数组指针,p 指向的数组是 4 个整型元素的
分析如下:
%d 是打印有符号的整数
%p 是打印地址的
-
数组和指针的类型差异:
a
是一个int[5][5]
类型的二维数组。p
是一个指向int[4]
的指针,即每次移动会跳过 4 个int
。
-
指针运算规则:
- 指针相减的结果是两个地址之间的元素个数,而非字节数。
&p[4][2]
相当于p + 4*4 + 2 = p + 18
(跳过 18 个int
)。&a[4][2]
相当于a + 4*5 + 2 = a + 22
(跳过 22 个int
)。
-
地址计算:
- 假设
a
的起始地址为0x0
,则:&p[4][2]
的地址为0x0 + 18*4 = 0x48
(每个int
占 4 字节)。&a[4][2]
的地址为0x0 + 22*4 = 0x58
。
- 地址差值为
0x48 - 0x58 = -0x10
(即 - 16 字节),但指针相减结果为-16 / 4 = -4
。
- 假设
运行结果:
5.题目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));
return 0;
}
解析:
1 | 2 | 3 | 4 | 5 |
6 | 7 | 8 | 9 | 10 |
*(aa+1)—— aa[1]
aa[1] 是第二行的数组名
数组名表示首元素地址
aa[1] 也是 &aa[1][0]
&aa[1] 第二行的地址
sizeof(aa[1])计算的是第二行的大小
运行结果:
6.题目6
#include <stdio.h>
int main()
{
char *a[] = {"work","at","alibaba"};
char**pa = a;
pa++;
printf("%s\n", *pa);
return 0;
}
解析:
a 是指针数组
a 是 char* 型的
pa 是 char** 型的
*pa 就是解引用是 at
运行结果:
7.题目7
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;
}
解析:
初始状态:
-
c
是一个字符指针数组,包含 4 个字符串常量的地址。 -
cp
是一个二级指针数组,初始化为{c+3, c+2, c+1, c}
。 -
cpp
是一个三级指针,初始指向cp
的起始位置。
第一次 printf
:**++cpp
-
++cpp
使cpp
指向cp[1]
(即c+2
)。 -
*cpp
解引用得到c+2
。 -
**cpp
进一步解引用得到c[2]
,即字符串"POINT"
。
输出:POINT
第二次 printf
:*--*++cpp+3
-
++cpp
使cpp
指向cp[2]
(即c+1
)。 -
*cpp
得到c+1
。 -
--*cpp
将c+1
减 1,变为c
(即cp[3]
的原始值)。 -
*--*cpp
解引用得到c[0]
(字符串"ENTER"
)。 -
+3
跳过前 3 个字符,指向"ER"
。
输出:ER
第三次 printf
:*cpp[-2]+3
-
cpp[-2]
等价于*(cpp-2)
,指向cp[0]
(即c+3
)。 -
*cpp[-2]
解引用得到c[3]
(字符串"FIRST"
)。 -
+3
跳过前 3 个字符,指向"ST"
。
输出:ST
第四次 printf
:cpp[-1][-1]+1
-
cpp[-1]
指向cp[1]
(即c+2
)。 -
cpp[-1][-1]
等价于*((c+2)-1)
,即c[1]
(字符串"NEW"
)。 -
+1
跳过首字符,指向"EW"
。
输出:EW
关键注意点:
-
指针运算直接修改了
cpp
和cp
中的值(如--*cpp
)。 -
下标访问(如
cpp[-2]
)基于当前cpp
的位置计算。 -
字符串偏移(如
+3
)从字符串起始位置向后跳过指定字符数。
运行结果:
相关文章:

指针运算典型例题解析
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)); return 0; } 解析: 运行结果: 2.题目2 在X86…...

DAX 权威指南1:DAX计算、表函数与计算上下文
参考《DAX 权威指南 第二版》 文章目录 二、DAX简介2.1 理解 DAX 计算2.2 计算列和度量值2.3 变量2.3.1 VAR简介2.3.2 VAR的特性 2.4 DAX 错误处理2.4.1 DAX 错误类型2.4.1.1 转换错误2.4.1.2 算术运算错误2.4.1.3 空值或 缺失值 2.4.2 使用IFERROR函数拦截错误2.4.2.1 安全地进…...

使用 NV‑Ingest、Unstructured 和 Elasticsearch 处理非结构化数据
作者:来自 Elastic Ajay Krishnan Gopalan 了解如何使用 NV-Ingest、Unstructured Platform 和 Elasticsearch 为 RAG 应用构建可扩展的非结构化文档数据管道。 Elasticsearch 原生集成了行业领先的生成式 AI 工具和提供商。查看我们的网络研讨会,了解如…...

20250508在WIN10下使用移远的4G模块EC200A-CN直接上网
1、在WIN10/11下安装驱动程序:Quectel_Windows_USB_DriverA_Customer_V1.1.13.zip 2、使用移远的专用串口工具:QCOM_V1.8.2.7z QCOM_V1.8.2_win64.exe 3、配置串口UART42/COM42【移远会自动生成连续三个串口,最小的那一个】 AT命令…...

C++(6):逻辑运算符
目录 1. 代码示例 示例 1:基础用法 示例 2:条件判断 2. 短路求值(Short-Circuit Evaluation) 代码示例 3. 实际应用场景 场景 1:输入合法性验证 场景 2:游戏状态判断 4. 注意事项 逻辑运算符用于组…...

NXP iMX8MP ARM 平台多屏幕克隆显示测试
By Toradex秦海 1). 简介 NXP i.MX8MP ARM SoC 支持 3 路 Display Controller 分别提供 DSI/HDMI/LVDS 显示输出,在 Yocto Linux BSP 下采用 Wayland Backend 基于 DRM subsystem 显示驱动,前端默认基于 Weston Compositor。因此在默认情况下连接多个屏…...
探秘 Canva AI 图像生成器:重塑设计创作新范式
Canva 凭借简洁易用的界面和海量模板资源,早已成为设计师和普通用户的心头好。而 Canva AI 图像生成器的推出,更是为设计领域带来了一场深刻变革,以智能化的手段重塑了图像创作的方式与边界。 技术内核:AI 如何驱动图像生成 Can…...

【数据结构】——栈
一、栈的概念和结构 栈其实就是一种特殊的顺序表,其只允许在一端进出,就是栈的数据的插入和删除只能在一端进行,进行数据的插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的元素遵循先进后出LIFO(Last InFirst O…...

Navicat中保存的数据库密码找回 Java 8
导出数据库连接打开导出的connections.ncx文件找到加密的password放入java程序中解密即可 package com.asia.card.cloud.enterprise.api;import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.nio.cha…...
构件是一个逻辑概念,还是一个物理概念?
在软件架构中,构件(Component)既可以是逻辑概念,也可以是物理概念,具体取决于上下文和系统设计的需求。以下是两种视角的详细分析: 1. 逻辑概念(抽象层面) 定义:构件是系统功能的逻辑划分,表示一组相关的职责或行为,不直接对应物理实现。 …...

vs code管理员权限启动问题
vs code非管理员启动可以正常启动用管理员启动vs code,会提示 解决办法 找到argv.json文件在argv.json文件中添加 "disable-chromium-sandbox": true重启vs code即可...

Spring Cloud与Service Mesh集成:Istio服务网格实践
文章目录 引言一、Spring Cloud与Service Mesh概述二、Istio服务网格架构三、Spring Cloud与Istio集成的基础设施准备四、服务发现与负载均衡五、流量管理与弹性模式六、安全通信与认证授权七、可观测性集成八、配置管理集成总结 引言 微服务架构已成为现代分布式系统的主流设…...
20250510-查看 Anaconda 配置的镜像源
打开 Anaconda Prompt 查看 Anaconda 当前配置的镜像源,使用命令 conda config --show channels这将显示当前配置的通道(channels),即镜像源列表。 此外,还可以使用 conda config --show命令来显示conda的配置信息&…...

React+Taro选择日期组件封装
话不多说,直接上效果 1.页面渲染时间模块 {this.renderCalendarPopup()}2.引入时间组件弹层,state中加入showPopup(控制什么时候展示时间选择弹层),time(选择后的时间值) private renderCalendarPopup () > {const { showPopup, time…...

C++进阶--AVL树的实现续
文章目录 C进阶--AVL树的实现双旋AVL树的查找AVL树的检验结语 很高兴和搭大家见面,给生活加点impetus,开启今天的比编程之路!! 今天我们来完善AVL树的操作,为后续红黑树奠定基础!! 作者&#x…...

AutoGen+Deepseek+chainlit的简单使用
AutoGen 的应用场景 AutoGen 作为一个强大的多智能体协作框架,可用于多种复杂任务: 自动化工作流:构建由多个智能体组成的流水线,例如数据收集、分析、报告生成复杂问题分解:将难题拆解为子任务,分配给不…...

采用SqlSugarClient创建数据库实例引发的异步调用问题
基于SqlSugar编写的多个WebApi接口,项目初始化时采用单例模式注册SqlSugarClient实例对象,前端页面采用layui布局,并在一个按钮事件中通过Ajax连续调用多个WebApi接口获取数据。实际运行时点击按钮会随机报下面几种错误: Execute…...

第7次课 栈A
课堂学习 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。 我们可以将栈类比为桌面上的一摞盘子,如果想取出底部的盘子,则需要先将上面的盘子依次移走。我们将盘子替换为各种类型的元素(如整数、字符、对象等&…...
部署RocketMQ
部署环境:jdk8以上,Linux系统 下载和安装指令: wget https://archive.apache.org/dist/rocketmq/4.9.4/rocketmq-all-4.9.4-bin-release.zip 显示下载成功: --2025-05-10 11:34:46-- https://archive.apache.org/dist/rocketm…...

软考-软件设计师中级备考 13、刷题 数据结构
倒计时17天时间不多了,数据库、UML、等知识点有基础直接略过,法律全靠考前的一两天刷题,英语直接放弃。 一、数据结构:链表、栈、队列、数组、哈希表、树、图 1、关于链表操作,说法正确的是: A)新增一个头…...

centos的根目录占了大量空间怎么办
问题 当根目录磁盘不够时,就必须删除无用的文件了 上面的,如果删除/usr 或/var是可以释放出系统盘的 定位占空间大的文件 经过命令,一层层查哪些是占磁盘的。 du -sh /* | sort -rh | head -n 10 最终排查,是有个系统日志占了20…...

电子电器架构 --- 新能源高压上下电那点事一文通
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

每日算法-250510
每日算法学习记录 - 250510 1. LeetCode 2086. 喂食仓鼠的最小食物桶数 题目描述: 解题思路 这是一个典型的贪心问题。我们的目标是用最少的食物桶喂饱所有仓鼠。 解题过程 核心思想是:当遇到一只仓鼠时,如何放置食物桶才能最有效地利用这个桶。 …...

渗透测试行业术语1
渗透测试行业术语1 1. 肉鸡 所谓“肉鸡”是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是 WINDOWS 系统,也可以是 UNIX/LINUX 系统可以是普通的个人电脑,也可以是大型的服务器我们可以象操作自己的电脑那样来操…...
[思维模式-25]:《本质思考力》-6- 马哲的三大规律:对立统一规律、质量互变规律、否定之否定规律,以及在计算机领域中的体现
一、马克思主义哲学的三大规律 马克思主义哲学的三大规律是对立统一规律、质量互变规律、否定之否定规律,它们共同构成了唯物辩证法的核心内容,揭示了事物发展的根本动力、过程形式和方向特征。 以下是对这三大规律的详细阐述: 1、对立统一…...
Ubuntu22.04安装显卡驱动/卸载显卡驱动
报错 今日输入nvidia-smi报错,在安装了535和550,包括560都没办法解决,但是又怕乱搞导致环境损坏,打算把显卡卸载然后重新安装系统默认推荐版本的显卡驱动 qinqin:~$ nvidia-smi Failed to initialize NVML: Driver/library version mismatch NVML library version: 560.35卸载…...
不同类型的 SAP 项目
目录 1 实施项目 2 SAP S/4 HANA 升级项目 3 数据迁移项目 4 优化项目 5 Rollout 项目 6 运维项目 1 实施项目 企业第一次用 SAP 系统,从硬件搭建到安装 SAP、根据业务流程做配置、开发、培训业务、测试系统直到系统上线。 SAP S/4 HANA ACTIVATE 实施方法论…...

【大模型】使用 LLaMA-Factory 进行大模型微调:从入门到精通
使用 LLaMA-Factory 进行模型微调:从入门到精通 一、环境搭建:奠定微调基础(一)安装依赖工具(二)创建 conda 环境(三)克隆仓库并安装依赖 二、数据准备:微调的基石&#…...
TWAS / FUSION
FUSION 是一套用于执行转录组范围和调控组范围关联研究(TWAS 和 RWAS)的工具。它通过构建功能/分子表型的遗传成分的预测模型,并使用 GWAS 汇总统计数据预测和测试该成分与疾病的关联,目标是识别 GWAS 表型与仅在参考数据中测量的…...
矩阵短剧系统:如何用1个后台管理100+小程序?深度解析多端绑定技术
短剧行业效率革命!一套系统实现多平台内容分发、数据统管与流量聚合 在短剧行业爆发式增长的今天,内容方和运营者面临两大核心痛点:多平台运营成本高与流量分散难聚合。传统模式下,每个小程序需独立开发后台,导致人力…...