Приведение указателя на матрицу при инициализации переменной является ссылкой или копией - PullRequest
1 голос
/ 29 апреля 2020

Мне было интересно, если в приведенном ниже коде matrix это просто ссылка на данные на pointer или это копия этих данных. Мне кажется, что это ссылка, но я просто хочу убедиться, что я прав.

void foo(void *pointer) {

    uint8_t (*matrix)[5][5][5][5] = (uint8_t(*)[5][5][5][5])pointer;
}

1 Ответ

0 голосов
/ 29 апреля 2020

Код недействителен. Вы не можете инициализировать массив указателем. Кажется, есть опечатка, и функция должна выглядеть так:

void foo(void *pointer) {
    uint8_t ( *matrix )[5][5][5][5] = (uint8_t(*)[5][5][5][5])pointer;
    // some other code
}

То есть указатель типа void * интерпретируется как указатель на массив типа uint8_t[5][5][5][5].

На самом деле в C вы можете просто написать

void foo(void *pointer) {
    uint8_t ( *matrix )[5][5][5][5] = pointer;
    // some other code
}

Вот демонстрационная программа (которая ничего не делает полезной), которая показывает использование такой конструкции.

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

#define N   5

void foo( void *pointer ) 
{
    uint8_t ( *matrix )[N][N][N][N] = pointer;

    for ( size_t i = 0; i < N; i++ )
    {
        for ( size_t j = 0; j < N; j++ )
        {
            for ( size_t k = 0; k < N; k++ )
            {
                for ( size_t l = 0; l < N; l++ )
                {
                    ( *matrix )[i][j][k][l] = N * ( i + j + k ) + l; 
                }
            }
        }
    }
}

int main(void) 
{
    uint8_t a[N][N][N][N];

    foo( &a );

    return 0;
}
...