C如何基于地址移动二维数组

时间:2017-01-18 23:49:04

标签: c arrays

我正在试图找出如何将二维数组作为单维数组循环。由于二维数组将占用连续存储器,因此有一种方法可以通过将索引更改4个字节来将二维数组作为单维数组进行寻址。我假设一个整数数组。有人可以提供一个例子吗?我尝试了以下但是它不起作用:

for (int i = 0; i < 2; i++){
    for (int j = 0;j < 2; j++){
        z[i][j] = count;
        count++;
    }
}

for (int i = 0; i < 4; i++)
    printf("%d\n", z[i]);

3 个答案:

答案 0 :(得分:0)

2D数组可以在一个循环中迭代,如下所示:

#include <stdio.h>

int main()
{
    int a[2][2], *p;
    a[0][0] = 100;
    a[0][1] = 200;
    a[1][0] = 300;
    a[1][1] = 400;

    p = &a[0][0];

    while(p!=&a[0][4])
        printf("%d\n", *p++);

    return 0;
}

请记住,数组索引只是数组第一个元素的偏移量,因此a[0][3]a[1][1]之间没有实际区别 - 它们都指向相同的内存位置。

答案 1 :(得分:0)

像这样访问2D数组

int *array;   // note one level of pointer indirection
array = malloc(width * height * sizeof(int));  / allocate buffer somehow

for(y=0;y<height;y++)
  for(x=0;x<width;x++)
    array[y*width+x] = 0; // address the element by calculation

三维

  int *array;   // note one level of pointer indirection
  array = malloc(width * height * depth * sizeof(int));  / allocate buffer somehow

 for(z=0;z<depth;z++)
   for(y=0;y<height;y++)
     for(x=0;x<width;x++)
       array[z*width*height + y*width+x] = 0; // address the element by calculation

通常,使用平缓冲区比使用多维数组的C和C ++复杂规则更容易。你当然也可以 使用单个索引遍历整个数组。如果你想设置 一个2D数组,然后将数组转换为单个指针,它表现为 同样的方式。

     #define HEIGHT 50
     #define WIDTH 90
     int array2D[HEIGHT][WIDTH}:

     int * array = reinterpret_cast<int *>(array2D): 

答案 2 :(得分:0)

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>   

int arr[4][3]={{1,2,3},{4,5,6},{7,8,9},{10,11,12}};


void my_fun(int(*a)[],int m,int n)
{

for(int i=0;i<m*n;i++)
 {
   printf("%d\n",(*a)[i]);
 }

}

int main()
{

  my_fun(arr,3,4);

 return 0;

}