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

17. 指针类型和步长概念问题

1. 项目场景:

➣ Jack Qiao对米粒说:“今天有道友遇到一个问题,举个栗子数组 arr[5] = { 0 };道友发现&arr[0] + 1&arr + 1打印出来的地址竟然不同。”米粒测试后果然是这样。


2. 问题描述

☑ 举个栗子:数组 arr[5] = { 0 };道友发现&arr[0] + 1&arr + 1打印出来的地址竟然不同。
☛ 测试的数据代码:
#include<stdio.h>
int main()
{int arr[5] = { 0 };printf("%p\n", arr);printf("%p\n", arr + 1);printf("------------------\n");printf("%p\n", &arr[0]);printf("%p\n", &arr[0] + 1);printf("------------------\n");printf("%p\n", &arr);printf("%p\n", &arr + 1);
}

☑  运行的结果如下:

 

☑ 可以看出000000639EB2F53C000000639EB2F54C16个字节。

3. 原因分析:

☑ printf("%p\n", (void*)arr);输出arr 的地址,即数组第一个元素 arr[0] 的地址

☑ printf("%p\n", (void*)(arr + 1));输出 arr + 1 的地址,即数组第二个元素 arr[1] 的地址。  ☛ 因为 arr 是一个指向 int 的指针,所以 arr + 1 的地址增加4个字节(假设 int 类型占4个字节)。

☑ ​​​​​​​printf("%p\n", (void*)&arr[0]);​​​​​​​输出 &arr[0] 的地址,即数组第一个元素 arr[0] 的地址。 &arr[0] 和 arr 是等价的​​​​​​​

☑ printf("%p\n", (void*)(&arr[0] + 1));​​​​​​​ 输出 &arr[0] + 1 的地址,即数组第二个元素 arr[1] 的地址。因为 &arr[0] 是一个指向 int 的指针,所以 &arr[0] + 1 的地址增加了4个字节(假设 int 类型占4个字节)。

☑ ​​​​​​​printf("%p\n", (void*)&arr);​​​​​​​输出 &arr 的地址,即整个数组 arr 的地址。&arr 是一个指向 int [5] 的指针,类型是 int (*)[5]

☑ ​​​​​​​printf("%p\n", (void*)(&arr + 1));​​​​​​​输出 &arr + 1 的地址。因为 &arr 是一个指向 int [5] 的指针,所以 &arr + 1 的地址增加了20个字节(5 * 4,假设 int 类型占4个字节)。&arr + 1 指向的是数组 arr 之后的内存位置。


4. 总结:

  • &arr + 1 增加的是整个数组的大小(20个字节)
  • &arr[0] + 1 增加的是一个 int 的大小(4个字节)

http://www.mrgr.cn/news/77861.html

相关文章:

  • 使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
  • 机器学习周志华学习笔记-第3章<线性模型>
  • react 使用中注意事项提要
  • C++多线程编程入门教程(优质版)
  • QT:QListView实现table自定义代理
  • C# 中的事件和委托:构建响应式应用程序
  • Node相关教程
  • css效果
  • vue面试题——描述一下vue
  • Linux高阶——1123—
  • 【阵列信号处理】相干信号和非相干信号生成
  • docker基础命令
  • 【C++知识总结2】C++里面的小配角cout和cin
  • #Verilog HDL# Verilog中的generate用法集锦
  • 【线程】Java多线程编程
  • 瑞佑液晶控制芯片RA6807系列介绍 (三)软件代码详解 Part.10(让PNG图片动起来)完结篇
  • MySQL学习/复习10视图/用户/权限/语言连接数据库
  • Vue实训---3-element plus的使用与布局
  • 深入解读:2023华为流程体系及落地实施
  • 【Bluedroid】A2DP SINK播放流程源码分析
  • BERT解析
  • 鸿蒙进阶-状态管理之@Prop@Link
  • 【老白学 Java】Warship v2.0(三)
  • 增量预训练(Pretrain)样本拼接篇
  • Gate学习(6) 指令学习3
  • WPF异步UI交互功能的实现方法