2014-09-25 5 views
1

У меня есть эта пара декларации/определения на моем IDE Eclipse (в .h и .hpp соответственно):Являются ли ** и * [] одинаковыми?

A(T* []); 

и

A<T>::A(T ** p_proc) { ... } 

Первый представляет собой массив указателей, другой указатель указателей. Я смущен тем, что они взаимозаменяемы; Eclipse жалуется, если я заменил ** на * [], выбросив синтаксическую ошибку. Однако Eclipse не вызывает ошибок, если я делаю противоположное.

Мой вопрос двоякий; эти две записи принципиально одинаковы? Есть T [][] и T ** так же хорошо? Почему Eclipse выдает синтаксическую ошибку, когда файл hpp имеет тип * [], но не в заголовке?

+0

'T [] []' является незаконным. 'T [] [x]' и 'T **' не совпадают. –

+0

@MattMcNabb; Я всегда думал, что они были одинаковыми при разложении ..: S – Brandon

+0

@Brandon различает списки параметров функций и другие сценарии. Список [список параметров функции] (http://stackoverflow.com/questions/22677415/why-do-c-and-c-compilers-allow-array-lengths-in-function-signatures-when-they/22677793#22677793) является синтаксическим причудой. В других случаях выражение с типом массива «распадается» на указатель на его первый элемент. Поскольку указатель не является массивом, этот указатель не затухает снова. Если существует 'T x [6] [4];' then 'x' (при использовании в сценарии распада) распадается на тип' T (*) [4] ', который не распадается дальше, поскольку это указатель , а не массив. –

ответ

6

Мой вопрос двоякий; эти две записи принципиально одинаковы?

Нет, они не являются. T*[] имеет тип массив неизвестного размера указателя к T тогда как T** имеет тип Указатель на указатель к T. Массивы и указатели не идентичны в целом.

Однако объявление функции параметра функции для типа массива точно так же, как объявление его соответствующего типа указателя. Если параметр функции указан для типа массива, то он «настроен» на соответствующий тип указателя. Точно так же int* и int[] - это не тот же тип, но когда вы пишете функцию, которая принимает параметр int[], она настраивается так, что она принимает параметр int*. (Обратите внимание, что эта корректировка подавляется, если параметр является ссылки на массив.)

Является T [][] и T ** так же, как хорошо?

Фактически T[][] не является допустимым шрифтом. В многомерном типе массива может быть опущен только , связанный с первым.

Почему Eclipse выдает синтаксическую ошибку, когда файл hpp имеет тип * [], но не в заголовке?

Возможно, потому что вы пишете T*[] p_proc. Правильный декларатор - T* p_proc[].

+0

Вы правы O_o Я писал T * [] p_proc. Хорошо. –

+0

@TamaYoshi 'A (T * [])' также является законным (имя параметра может быть опущено в декларации) –

3

Они одинаковые для параметров для функций. Параметр функции не может иметь тип «массив T». Если вы попытаетесь объявить параметр функции как имеющий тип «массив Т», компилятор (тихо) отрегулирует его на «указатель на Т».

Это не так в другом месте. Просто, например, иметь что-то вроде:

//filea.cpp 
int x[SIZE]; 

и:

//fileb.cpp 
extern int *x; 

... будет не работу.

1

Если Eclipse, не понимая, следующий случай, это ошибка:

template<typename T> 
struct A{ 
    A(T **p_proc); 
}; 

template<typename T> 
A<T>::A(T *p_proc[]) {} 

Это perfectly fine.

Проверьте вопрос о массивах, распадающихся на указатели, чтобы понять их более подробно.

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