二级指针与指针数组搭配

目录

先明确核心前提

[用具体内存地址拆解(64 位系统)](#用具体内存地址拆解(64 位系统))

[1. 二维数组arr_1的内存布局(连续存储,每个 int 占 4 字节)](#1. 二维数组arr_1的内存布局(连续存储,每个 int 占 4 字节))

[2. 指针数组arr的内存布局(每个元素是 int*,占 8 字节)](#2. 指针数组arr的内存布局(每个元素是 int*,占 8 字节))

[3. 二级指针k的指向](#3. 二级指针k的指向)

[关键:k+1的 8 字节偏移到底偏移了什么?](#关键:k+1的 8 字节偏移到底偏移了什么?)

再看k[1][1]的完整执行过程

[对比:你以为的 "8 字节偏移" vs 实际的 "8 字节偏移"](#对比:你以为的 “8 字节偏移” vs 实际的 “8 字节偏移”)

总结


复制代码
#include<stdio.h>
int main()
{
    //指针数组与二级指针的运用
    int arr_1[2][3] = {1,2,3,4,5,6};
    int *arr[2] = {arr_1[0],arr_1[1]};
    int **k = arr;  //二级指针每次偏移8个字节
    printf("%d\n",k[1][1]);//5
    return 0;
}

分析上面的代码理解:
核心是 混淆了 "二级指针偏移的对象" 和 "二维数组元素的偏移" ------ 觉得 "偏移 8 字节是两个 int 元素"(因为 int 占 4 字节),这个结论只对 "直接偏移 int 类型" 成立,但二级指针 k的 8 字节偏移, 根本不是针对二维数组的 int 元素 ,而是针对指针数组 arr里的指针元素,我用具体的内存布局帮你彻底理清。

先明确核心前提

你的误区:把 "二级指针 k 的 8 字节偏移" 等价于 "二维数组 arr_1 的 int 元素偏移",但实际上两者偏移的是完全不同的对象。

用具体内存地址拆解(64 位系统)

我们给所有变量分配真实的内存地址,一步一步看:

1. 二维数组 arr_1****的内存布局(连续存储,每个 int 占 4 字节)
2. 指针数组 arr****的内存布局(每个元素是 int*,占 8 字节)
3. 二级指针 k****的指向

k = arr → k的值是 0x200(指向 arr 数组的首地址)。

关键: k+1****的 8 字节偏移到底偏移了什么?

你说 "偏移 8 字节只是偏移了两个元素",这个结论的问题在于: 你以为偏移的是 arr_1 里的 int 元素,但实际偏移的是 arr 里的指针元素

  • k的初始地址:0x200(指向 arr [0])
  • k+1:偏移 1 单位(8 字节)→ 地址变为 0x208(指向 arr [1])✅ 这一步偏移的是指针数组 arr 的 1 个指针元素(8 字节),不是 arr_1 的 int 元素;❌ 不是偏移 arr_1 的 2 个 int 元素(虽然 8 字节等于 2 个 int 的大小,但偏移的对象完全不同)。

再看 **k[1][1]**的完整执行过程

k[1][1]等价于 *(*(k+1)+1),拆成两步:

  1. 第一步:*(k+1) → 解引用偏移后的 k+1(地址 0x208),得到 arr [1] 的值0x10C(这是 arr_1 第二行的首地址);
  2. 第二步:*(0x10C + 1) → 这里的 "+1" 是一级指针(int*)的偏移,偏移 1 单位 = 4 字节,所以 0x10C+4=0x110,解引用得到值 5。

对比:你以为的 "8 字节偏移" vs 实际的 "8 字节偏移"

总结

  1. 偏移的对象 决定了字节数的含义:二级指针k偏移 8 字节,是偏移 1 个int*类型的指针(arr 数组的元素),而非偏移 2 个int类型的元素;
  2. k[1][1]是两次偏移:第一次是二级指针偏移(8 字节,找 arr 的第 2 个指针),第二次是一级指针偏移(4 字节,找 arr_1 第二行的第 2 个元素);
  3. 你混淆了 "指针数组的指针元素" 和 "二维数组的 int 元素",8 字节的大小巧合(等于 2 个 int)让你误以为偏移的是 int 元素,但偏移的对象才是核心。
相关推荐
小O的算法实验室20 小时前
2026年ASOC,基于深度强化学习的无人机三维复杂环境分层自适应导航规划方法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
‎ദ്ദിᵔ.˛.ᵔ₎20 小时前
LIST 的相关知识
数据结构·list
qq_3395548220 小时前
英飞凌ModusToolbox环境搭建
c语言·eclipse
M--Y21 小时前
Redis常用数据类型
数据结构·数据库·redis
张張40821 小时前
(域格)环境搭建和编译
c语言·开发语言·python·ai
郭涤生21 小时前
STL vector 扩容机制与自定义内存分配器设计分析
c++·算法
༾冬瓜大侠༿21 小时前
vector
c语言·开发语言·数据结构·c++·算法
Ricky111zzz21 小时前
leetcode学python记录1
python·算法·leetcode·职场和发展
汀、人工智能21 小时前
[特殊字符] 第58课:两个正序数组的中位数
数据结构·算法·数据库架构··数据流·两个正序数组的中位数
liu****21 小时前
第16届省赛蓝桥杯大赛C/C++大学B组(京津冀)
开发语言·数据结构·c++·算法·蓝桥杯