You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用单个指针遍历二维数组的列?附A[3][2]数组示例

用单个指针遍历二维数组A[3][2]的两列元素

嘿,这个问题问得很到位!用单个指针搞定二维数组的列遍历,核心就是要摸透C语言里二维数组在内存中的连续存储规则——它是按行优先顺序排布的,也就是说你的数组A[3][2] = {{1,2},{3,4},{5,6}}在内存里是一串连续的整数:1,2,3,4,5,6,完全没有所谓的“二维”边界,只是我们代码里的语法糖让它看起来是二维的。

下面给你两种用单个指针实现的方式,都是基于这个内存布局来的:

方式一:通过计算偏移量访问

这种方式用指针的起始地址加上偏移量来定位元素,逻辑清晰,适合理解原理:

#include <stdio.h>

int main() {
    int A[3][2] = {{1,2}, {3,4}, {5,6}};
    int* ptr = &A[0][0]; // 单个指针指向数组的第一个元素

    // 遍历第一列:1、3、5
    printf("第一列元素:\n");
    for (int i = 0; i < 3; i++) {
        // 每一行有2个元素,所以下一行同列元素的偏移是 i*2
        printf("%d ", *(ptr + i * 2));
    }
    printf("\n");

    // 遍历第二列:2、4、6
    printf("第二列元素:\n");
    for (int i = 0; i < 3; i++) {
        // 第二列的起始偏移是1,之后同样每行跳2个元素
        printf("%d ", *(ptr + i * 2 + 1));
    }
    printf("\n");

    return 0;
}

方式二:直接移动指针访问

这种方式更贴近指针的本质,通过直接修改指针的位置来遍历,代码更简洁:

#include <stdio.h>

int main() {
    int A[3][2] = {{1,2}, {3,4}, {5,6}};
    int* ptr = &A[0][0]; // 初始化指针到数组首元素

    // 遍历第一列
    printf("第一列元素(指针移动版):\n");
    for (int i = 0; i < 3; i++) {
        printf("%d ", *ptr);
        ptr += 2; // 跳过当前行的第二个元素,直接到下一行的同列位置
    }
    printf("\n");

    // 重置指针到第二列的第一个元素,继续遍历
    ptr = &A[0][1];
    printf("第二列元素(指针移动版):\n");
    for (int i = 0; i < 3; i++) {
        printf("%d ", *ptr);
        ptr += 2; // 同样跳过一行的元素,到下一行的同列位置
    }
    printf("\n");

    return 0;
}

核心要点总结

  • 不管是哪种方式,本质都是利用二维数组在内存中是连续一维存储的特性
  • 列元素之间的间隔等于数组的列数(这里是2),因为每一行有2个元素,所以下一行的同列元素在内存中会隔2个int的位置
  • 单个指针在这里就是一个普通的int*指针,完全不需要用二维指针或者数组指针,只要计算对偏移量就行

内容的提问来源于stack exchange,提问作者Prajwal Prakash

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 21:12:31