C语言二维数组指针详解:从内存布局到遍历操作

叶初
叶初
发布时间:2026-10-15 | 4人浏览过
原创

本文深入解析C语言二维数组指针,讲解其在连续内存中的布局机制,重点阐述 int (*p)[4] 的定义与运算规则,并给出利用指针遍历二维数组的标准代码。

二维数组的内存布局

虽然二维数组在逻辑上表现为具有行和列的矩阵结构,但在计算机内存中,其元素是连续排列的一维数据。以如下定义的数组为例:

int a[3][4] = { {0, 1, 2, 3}, {4, 5, 6, 7}, {8, 9, 10, 11} };

逻辑分布示意如下:

C语言默认按行优先顺序存放数据,即先存储第0行的全部元素,接着是第1行,依此类推。对于 int 类型(假设占用4字节),整个数组占据 3 * 4 * 4 = 48 字节的空间。

可以将二维数组视为多个一维数组的组合,即 a[0]、a[1]、a[2]。每个一维数组包含4个整数元素。若首元素地址为1000,则各行起始地址间隔为一个一维数组的长度(16字节)。

定义与初始化二维数组指针

为了使用指针操作二维数组,需要定义一个“指向一维数组”的指针变量,而非指向单个元素的普通指针。

int (*p)[4] = a;

语法要点:

  • * 表明 p 是指针。
  • [ ] 优先级高于 *,因此 ( ) 括号必不可少。
  • 括号内的 4 表示 p 指向的数组必须包含4个 int 元素。
  • 错误写法 int *p[4] 会被解析为指针数组,而非二维数组指针。

指针运算特性:

  • p + 1:向前移动一个一维数组的长度(16字节),指向下一行。
  • p - 1:向后移动一个一维数组的长度,指向上行。

数组名 a 在表达式中会自动转换为与该指针等价的类型地址。

指针访问二维数组元素的推导

结合上述定义,可以逐步推导各层级的含义:

  1. p + i:指向二维数组的第 i 行。
  2. * (p + i):表示第 i 行的数据整体。在表达式中,这通常被隐式转换为首元素地址(即该行第0个元素的地址)。验证代码如下:
#include <stdio.h>
int main() {
    int a[3][4] = {{0,1,2,3},{4,5,6,7},{8,9,10,11}};
    int (*p)[4] = a;
    // p指向int[4],移动一步即为一个子数组长度
    printf("%d\n", sizeof(*(p + 1))); 
    return 0;
}

运行结果为 16,证实了它代表一整行的大小。

  1. * (p + i) + j:指向第 i 行第 j 列元素的地址。此时相当于对整行数据取址,再偏移 j 个元素。
  2. * (*(p + i) + j):直接获取第 i 行第 j 列元素的值。

关键等价关系:

a + i == p + i
a[i] == p[i] == *(a + i) == *(p + i)
a[i][j] == p[i][j] == *(*(a + i) + j) == *(*(p + i) + j)

完整实例:指针遍历二维数组

下面展示如何利用上述原理编写一个完整的程序,通过双重循环遍历输出二维数组的所有元素。

#include <stdio.h>
int main() {
    int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};
    int (*p)[4];
    int i, j;

    p = a; // p指向二维数组首地址

    for (i = 0; i < 3; i++) {
        for (j = 0; j < 4; j++) {
            // 访问 a[i][j]
            printf("%2d  ", *(*(p + i) + j));
        }
        printf("\n");
    }
    return 0;
}

程序输出:

 0   1   2   3
 4   5   6   7
 8   9  10  11

区别:指针数组与二维数组指针

二者定义相似但物理意义完全不同:

int *p1[5]; // 指针数组:长度为5的数组,元素均为 int* 指针。
int (*p2)[5]; // 二维数组指针:指向一个包含5个int元素的数组。
  • 内存占用: 指针数组占用的内存较大(32位系统下 5 * 4 = 20 字节);而二维数组指针本质上只是一个地址,仅占用 4 字节。
  • 使用场景: 指针数组常用于处理不连续的内存块或字符串表;二维数组指针专门用于操作连续分配的二维矩阵数据。

以上就是C语言二维数组指针的概念及使用的详细内容,更多关于C语言指针操作的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表