指针和数组,指针和二维数组、多维数组

一维数组

#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语言的语法规则,方括号[ ]的优先级比*高。什么优先级高,表明其本质是一个什么变量。

  1. 不加括号时,方括号优先级高,所以 int *p_seq[COLS] 本质上是一个变量名为p_seq的数组,它里面存储的全是指针变量如int *p1, *p2, *p3,而不是int。(可以把int *p_seq[COLS] 看作是int *(p_seq[COLS]),左边的int *视为整体,类比整型数组int seq[COLS]

  2. 加括号时,*p_seq优先级高,它本质是一个指针,指向一个内含COLSint元素的数组,即p_seq是一个指向数组的指针。

多维数组

可以以二维数组类推

// 三维数组
int array[2][3][4] = {
   //data
};
// 指向三维数组的指针
int (*ptr)[3][4] = array;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容