2017-01-18 3 views
-1

Я пытаюсь выяснить, как пропустить 2-мерный массив в виде одномерного массива. Поскольку 2-мерный массив будет занимать непрерывную память, существует ли способ адресовать двумерный массив как одномерный массив, изменяя индекс на 4 байта. Я принимаю целочисленный массив. Может ли кто-нибудь привести пример? Я попытался следующие, но это не работает:C как перемещаться по 2-мерному массиву на основе адреса

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

Возможный дубликат [Объяснить 2D массив итерации с 1 цикла] (http://stackoverflow.com/questions/16976328/explain-2d-array-iteration-with-1-loop) – DeiDei

+0

Just используйте первый подмассив ... например. для 'int arr [3] [3]' index 'arr [0]' из 'arr [0] [0]' to 'arr [0] [8]' ... или использовать 'int *', например : 'int * p = arr [0];' и использовать 'p [0]' ... 'p [8]' – Dmitri

+0

[пример] (http://ideone.com/qDXQhT) – BLUEPIXY

ответ

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] - они оба относятся к той же ячейке памяти.

+0

Как это возможно, правильно [0] [3] и [1] [1] имеют разные значения. на самом деле, на основе вашего примера, [0] [3] выходит за пределы, а в [1] [1] хранится 400. О, они оба смещены на 4 места. и int [] [] почти * – DCR

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): 
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; 

} 
Смежные вопросы