一维数组
#define SIZE 100
int scores[SIZE] = {0};
int *p_scores = scores;
二维数组
#define ROWS 3
#define COLS 4
int sequence[ROWS][COLS] = {
{0, 1, 2, 3},
{4, 5, 6, 7},
{8, 9, 10, 11}
}
int (*p_seq)[COLS] = sequence;
其实,p_seq可以指向任何列是COLS的二维数组。如
int sequence_2[2][COLS] = {
{1, 2, 3, 4},
{5, 6, 7, 8}
};
int sequence_3[100][COLS] = {
{1, 2, 3, 4},
...
...
};
p_seq = sequence_2; // 有效
p_seq = sequence_3; // 有效
同时要注意
*p_seq
的括号不能省略,因为int (*p_seq)[COLS]
和int *p_seq[COLS]
的语义完全不同。
根据C语言的语法规则,方括号[ ]
的优先级比*
高。什么优先级高,表明其本质是一个什么变量。
不加括号时,方括号优先级高,所以
int *p_seq[COLS]
本质上是一个变量名为p_seq
的数组,它里面存储的全是指针变量如int *p1, *p2, *p3
,而不是int
。(可以把int *p_seq[COLS]
看作是int *(p_seq[COLS])
,左边的int *
视为整体,类比整型数组int seq[COLS]
)加括号时,
*p_seq
优先级高,它本质是一个指针,指向一个内含COLS
个int
元素的数组,即p_seq
是一个指向数组的指针。
多维数组
可以以二维数组类推
// 三维数组
int array[2][3][4] = {
//data
};
// 指向三维数组的指针
int (*ptr)[3][4] = array;