2016-04-21 5 views
7

Так у меня есть struct:Как правильно инициализировать переменную const int const *?

typedef struct myStruct 
{ 
    const int *const array_ptr; 
} myStruct_s; 

У меня есть const массива int:

const int constArray[SIZE1] = 
{ 
     [0] = 0, 
     [1] = 1, 
     [2] = 2, 
     //... 
}; 

Теперь у меня есть const массива myStruct_s инициализирован с назначенными инициализаторами:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = &constArray 
      }, 
     //... 
} 

Я получаю предупреждение:

значения типа «сопзИ Int (*) [size1]» не может быть использован для инициализации объекта типа «сопзИте Int * сопзИте»

Как правильно инициализировать этот указатель?

Я хотел бы избежать:

const myStruct_s structArray[SIZE2] = 
{ 
     [0] = 
      { 
        .array_ptr = (const int *const) &constArray 
      }, 
     //... 
} 

Если это возможно, так как я чувствую, что я говорю компилятор «Я не знаю, что я делаю, просто не проверяют тип пожалуйста» ...

Спасибо за помощь :).

+1

'array_ptr = & constArray [0];' – Nadir

+3

Индексы массива начинаются с 0. Ваши назначения ('[1] = 1') начинаются с 1. Не связано с проблемой, но выглядит подозрительно. – davmac

+0

@ davmac: Вы правы! На самом деле я использую 'enum' в качестве индексов для заполнения массивов. Я никогда не использую магические числа :). Я упростил свой код слишком быстро! – Plouff

ответ

11

constArray уже (распадается) указатель, вы хотите

.array_ptr = constArray 

или

.array_ptr = &constArray[0] /* pointer to the first element */ 

вместо

.array_ptr = &constArray /* you don't want the address of */ 

Рассмотрим

int a[] = {1,2}; 
int *p = &a; 

Это не правильно, потому что p хочет указатель на int (&a[0] или просто a), а не указатель на массив 2 int (&a)

+1

Правильно, но может использовать объяснение, почему именно '& constArray' не работает. – davmac

+0

А, ок, я попробую, но мой английский очень плохой :) –

+0

@ davmac, сделано, не стесняйтесь улучшать редактирование –

-1

Вы должны удалить амперсанд еще до constArray, который затем получить совместимый тип указателя.

Причина: массивы обрабатываются аналогично указателям на C. Таким образом, constArray уже эффективно const int *const. Но когда вы берете адрес, т. Е. &constArray, вы действительно получаете тип, который будет совместим с const int *const *const.

+4

Нет. Вы получаете тип, который был бы совместим с 'const int (*) []'. Массивы не распадаются на указатели, если они являются операндами '&'. – davmac

+3

Второй абзац - мусор –

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