2014-09-21 2 views
-1

для объявления 2 одномерного массива указателей это код:2 одномерный массив указателей

int x; 
cin>>x; 

int** pointerx = new int*[x]; 
for(int i = 0; i<x;i++){ 
    pointerx[i] = new int[x]; 
} 

Поскольку C++ 14 или через расширения компилятора:

int* pointerx[x][x]; 

Есть ли подводные камни в использовании 1-й код вместо 2-го или наоборот?

+2

Использовать 'vector >' –

+0

Что делать, если ваш работодатель просит вас написать контейнер без использования STL? – voltaa7

+1

первый и второй не то же самое. Посмотрите внимательно. – Arne

ответ

1

int* pointerx[x][x]; не является законным в C++ 14. Он был добавлен к ранним сквознякам, но затем удален до окончательной спецификации.

Основные ловушки с помощью расширения компилятора являются:

  • Ваш код может не работать (или работать по-другому) на других компиляторов, или на других версиях одного и того же компилятора.
  • Как правило, нет четкой документации о том, что делает код, поэтому трудно получить поддержку, если ваш код не работает.

Если вы смотрите через стандарт C для текста переменно модифицированного типа вы увидите, что это происходит во многих местах; эффект, позволяющий массиву переменной длины иметь «эффект бабочки», и он в конечном итоге влияет на многие другие вещи на этом языке.

Например, если int* pointerx[x][x]; разрешен, ваш компилятор также поддерживает int* (*y)[x] == pointerx; и правильно ли он обрабатывает sizeof *y? Может быть, так оно и есть; ваша документация компилятора также описывает это?

+0

спасибо, что сказал мне, что это не законное в C++ 14, я думал, что это так. – voltaa7

+0

no 'int * (* y) [x] == pointerx' дает ошибку, а' sizeof * y' работает нормально. Что это означает на самом деле: 'int * (* y) [x] == pointers' – voltaa7

+0

Возвращаясь к основному вопросу' int * pointer [x] [x] '- массив переменной длины, компилятор разрешил его расширение, поскольку я все еще на C++ 11; он предлагает какое-либо преимущество в некоторых сценариях (поэтому он был включен в расширение!). Каковы эти сценарии и каковы подводные камни? – voltaa7

0

Первый набор кода - указатель указателя на int, вы указываете на указатель, указывающий на int, или в этом случае массив указателей int, поэтому pointerx [i] обычно не содержит int, а второй бит кода будет указатель на 2D массив целых чисел, так pointerx [я] [я] будет на самом деле дать вам Int

не стесняйтесь комментировать, если вам нужно это объясняло лучше

+0

Да, я хочу объяснения! – voltaa7

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