我正在试图找出如何将二维数组作为单维数组循环。由于二维数组将占用连续存储器,因此有一种方法可以通过将索引更改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]);
答案 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;
}