C语言二维数组的Typedef定义与指针访问方法问询
正确通过table_t指针访问4行2列二维数组的方法
首先要明确你的table_t类型定义需直接对应整个4行2列的二维数组,标准写法如下:
typedef int table_t[4][2];
问题根源
你遇到的访问异常,本质是对二维数组指针的类型理解偏差:
- 声明
table_t a时,a是完整的4行2列二维数组,它在表达式中会隐式退化为指向首行的指针(类型为int (*)[2]); - 若要声明指向整个
table_t类型的指针,必须写成table_t *b = &a——这里的b是指向整个4x2数组的指针,而非指向单一行的指针。
正确访问方式
通过b访问元素时,需先对b解引用获取完整数组,再用下标访问:
#include <stdio.h> typedef int table_t[4][2]; int main() { table_t a = {{1, 2}, {3, 4}, {5, 6}, {7, 8}}; table_t *b = &a; // 正确访问逻辑:解引用b得到数组a,再用[i][j]定位元素 for (int i = 0; i < 4; i++) { for (int j = 0; j < 2; j++) { printf("%d ", (*b)[i][j]); } printf("\n"); } return 0; }
常见错误写法分析
- 错误:
b[i][j]
这种写法会让b[i]直接跳过i个完整的4x2数组(即8个int的内存空间),触发越界访问,导致值异常或“旋转”现象。 - 错误:
*(b + i)[j]
受运算符优先级影响,(b+i)先被解引用,但b+i是指向第i个4x2数组的指针,同样会出现越界问题。
可选的typedef简化思路
若希望指针访问更直观,可将table_t定义为二维数组的行类型(即2列的一维数组):
typedef int table_t[2];
此时声明指针时直接用table_t *b = a(a退化为指向首行的指针,与b类型匹配),即可直接用b[i][j]访问:
table_t a[4] = {{1,2}, {3,4}, {5,6}, {7,8}}; table_t *b = a; printf("%d", b[2][1]); // 输出6,访问正确
内容的提问来源于stack exchange,提问作者Vyacheslav Verkhovin
相关产品推荐
相关产品推荐

