如何使用单个指针遍历二维数组的列?附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
相关产品推荐
相关产品推荐

