C ++: как получить доступ к многомерному массиву с помощью указателей? - PullRequest
1 голос
/ 24 сентября 2010

Дано: (в C ++)

int main () {

    int* ptr;
    int ary [10][2];
    ptr = ary; 

    return 0;
}

Как мне получить доступ к ary[0][1] с ptr?

Ответы [ 4 ]

3 голосов
/ 24 сентября 2010

Вы не можете, потому что тип ptr неправильный. Переменная должна быть объявлена ​​как int(*)[2] (указатель на массив целых чисел размера 2). Тогда вы можете просто использовать ptr[0][1].

#include <cstdio>

int main () {

    int (* ptr) [2];   // <--
    int ary [10][2];
    ptr = ary; 

    ary[0][1] = 5;
    printf("%d\n", ptr[0][1]);

    return 0;
}

Если вы должны использовать int*, вам нужно ввести reinterpret_cast. Индексы массива выложены так:

    0       1        2         3              2*n      2*n+1
[0][0]  [0][1]   [1][0]    [1][1]    ...    [n][0]    [n][1]

чтобы вы могли использовать ptr[1] для получения ary[0][1].

#include <cstdio>

int main () {

    int* ptr;
    int ary [10][2];
    ptr = reinterpret_cast<int*>(ary);  // <--

    ary[0][1] = 5;
    printf("%d\n", ptr[1]);

    return 0;
}
2 голосов
/ 24 сентября 2010
typedef int tenints[10];  // tenints is an array of 10 ints



int main () { 

 tenints  ary[2];       // array of 2 tenints, same as your int ary[10][2];
 tenints* ptr = ary

 // ptr[0] or *ptr is the first row
 // ptr[1] or *(ptr+1)is the second row

int* ptr2 = ptr[0];
// ptr2[1] or *(ptr2+1) is ary[0][1]

// if you don't want do use as intermediate variable,
// just substitute "*ptr" for "ptr2" in "*(ptr2+1)"
int val = *((*ptr)+1);


return 0; 

}

1 голос
/ 12 августа 2012

это возможно, просто посмотрите на этот пример (это динамические массивы, но работают и со статическими):

void bla ( void )
{
    const int32_t sx = 50, sy = 30, sz = 50;
    uint64_t *** n = NULL;
    n = ( uint64_t*** )malloc( sizeof( uint64_t** ) * sx );
    for ( int32_t x = 0; x < sx; x++ )
    {
        *( n + x ) = ( uint64_t** )malloc( sizeof( uint64_t* ) * sy );
        for ( int32_t y = 0; y < sy; y++ )
            *( *( n + x ) + y ) = ( uint64_t* )malloc( sizeof( uint64_t ) * sz );
    }

    for ( int32_t x = 0; x < sx; x++ )
        for( int32_t y = 0; y < sy; y++ )
            for( int32_t z = 0; z < sz; z++ )
                *( *( *( n + x ) + y ) + z ) = 1024 * 1024;
}
1 голос
/ 24 сентября 2010

То, что вы хотите, работает только тогда, когда данные находятся в блоке, что может быть не во всех случаях. В контексте обработки изображений вы в основном делаете что-то вроде этого:

int width = 1024;
int height = 768;
char* img = new char[width*height];
char** img2d = new char*[height];
for (int y = 0; y < height; ++y){
  img2d[y] = img + y*width;
}
//set pixel at x=50, y=100
img2d[100][50] = 1;
//does the same
img2d[100*width+50] = 1;
delete[] img;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...