C语言里如何将指针指向一个二维数组?

比如有一个二维数组:

int block[4][8] = {0};

该如何定义一个指针并指向上面这个数组呢?

还有就是如何使用这个指针?也就是用指针来代替下面循环中的block。

for(int k=0; k<8; k++)
{
    if(block[i][k]>0)
    {
      //do something
    }  
}
阅读 6.9k
3 个回答
#include <stdio.h>
int main(void)
{
  int i = 0;
  int block[4][8] = {0,1,2,3,4,5,6,7};
  int (*p)[8] = block; //p指针指向一个包含8个int值的数组,这样一来以后对block+1时直接跳8个int单位,从block[0]跳到block[1]。如果不加括号,p会先与[8]结合,得到一个含8个指针的数组。
  for(int k=0;k<8;k++)
  {
    if(*(*(block+i)+k) >= 0)
    {
      //do sth.
      printf("*(*(block+%d)+%d) : %d \n",i,k,*(*(block+i)+k));  //首先对block+i取值,等同于block[i],得到一个一维数组的指针,再对block[i]+k取值,等同于block[i][k]。
    }
  }
  return 0;
}

因为数据都是顺序存储在一起的,所以也可以用一个指针完成对二维数组的遍历。

int *p = &block[0][0];
for (int i=0; i<4*8; ++i)
    if (p[i] > 0) {
        // do_sth
    }
[1]p指向数组首地址通过嵌套循环遍历数组所有元素
int *p = block;
int i,j;
for(i = 0;i < 4;i++)
{
    for(j = 0;j < 8;j++)
    {
        if(*(*(p+i)+j) > 0)
        {
            //do something
        }
    }
}
[2]p指向一个含有8个int元素的数组,p + 1移动一个数组大小
int (*p)[8] = block
int i,j;
for(i = 0;i < 4;i++)
{
    for(j = 0;j < 8;j++)
    {
        if(*(p + i)[j] > 0)
        {
            //do something
        }
    }
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进