当前位置: 首页 > news >正文

考验大家指针功底的时候到了:请问如何理解 (int*)1 + 1 ?

 来,猜猜看,这里的执行结果是什么?

这是今天课上的一道理解题,给大家一点点思考时间。

(心里有答案了再往下滑哦) 

5

4

3

2

1

.

答案是报warning!因为%d不是用来输出指针的哈哈哈 

不过如果忽略warning呢?

那么最终答案是:5 

为什么是 5?

1 + 1 = 5?

哈哈别急,让我们来进行一些简单的实验。

#include<stdio.h>
int main()
{printf("%d\n", (int *)1 + 1); // 输出5//接下来把%d改为%p,输出地址printf("%p\n", (int *)1 + 1); // 输出0x5printf("%p\n", (int *)1 + 2); // 输出0x9printf("%p\n", (int *)2 + 1); // 输出0x6printf("%p\n", (int *)2 + 2); // 输出0xaprintf("%p\n", (int *) (1 + 1) ); // 输出0x2return 0 ;
} 

多实验几次就会明显发现,

第一个数每+1地址增加1,

第二个数每+1地址就增加4,

而(int*)(1+1) 也就是(int*)2,指向的就是地址2,

所以,系统应该是先执行(int*)1,将指针指向地址1,然后再执行+1,使指针指向当前地址的下一个位置,因为int占4个字节所以指针每次跳4个,所以最终指向1+4,也就是地址5的位置。

(如果将int改为其他类型也是同样:)

#include<stdio.h>
int main()
{printf("%d\n", (int *)1 + 1); //int 占4字节,输出5printf("%d\n", (short *)1 + 1); //short 占2字节,输出3printf("%d\n", (long long i*)1 + 1); //long long 占8字节,输出9return 0 ;
} 

以上是我的个人理解,欢迎大佬们前来赐教~

http://www.lryc.cn/news/64116.html

相关文章:

  • 英语基础-介词
  • Linux进程通信:进程组 会话
  • 【前端面经】JS-深浅拷贝
  • 【自然语言处理】实验2布置:Word2Vec TransE案例
  • Redis集合底层实现原理
  • OVS常用命令与使用总结
  • 一以贯之:从城市网络到“城市一张网”
  • 【Java校招面试】基础知识(四)——JVM
  • 项目管理-计算专题(三点估算、PERT估算)
  • 【华为OD机试 2023最新 】模拟商场优惠打折(C语言题解 100%)
  • 使用TrieTree(字典树)来实现敏感词过滤
  • USB转串口芯片CH9101U
  • Java语言介绍
  • 终于把 vue-router 运行原理讲明白了(二)!!!
  • ChatGPT实现服务器体验沙箱
  • 【算法】刷题中的位运算
  • 9.Java中异常处理机制是什么
  • GeoTools实战指南: 叠加GeoTIFF与Shapefile图层生成截图
  • nginx配置sh脚本远程执行一键安装
  • Excel表格成绩排名全攻略,让你事半功倍!
  • Docker 持久化存储 Bind mounts
  • LVS +Keepalived 高可用群集部署
  • Kafka调优
  • Debezium系列之:详细介绍Debezium2.X版本导出Sqlserver数据库Debezium JMX指标的方法
  • 基于PWM技术的三相光伏逆变器研究(Simulink)
  • 〖Python网络爬虫实战㉑〗- 数据存储之JSON操作
  • 不得不说的行为型模式-责任链模式
  • 基于dsp+fpga+AD+ENDAC的半导体运动台高速数据采集电路仿真设计(四)
  • 快速搭建Electron+Vite3+Vue3+TypeScript5脚手架 (无需梯子,快速安装Electron)
  • 语义分割学习笔记(二)转置卷积