2014-09-22 5 views
4

Рассмотрим следующие случаи:Указатель на объявлении массива

1.

extern int *a; 
int *a = new int(1); //OK 

2.

extern int a[]; 
int a[5]; //Ok 

3.

extern int (*a)[]; 
int (*a)[5]; //error: redefinition of 'a' with a different type: 'int (*)[5]' vs 'int (*)[]' 

Не могли бы вы объяснить, почему 3-й случай броска ошибка времени компиляции? Какой точный deffirent из предыдущих двух? Я ищу соответствующую ссылку на Стандарт.

+1

Вы пытались выполнить 'extern int (* a) [5]'? Существует трюк с пустым '[]', который иногда рассматривается как другой указатель, поэтому ваш код, возможно, интерпретируется как 'extern int (** a)'. – TalesM

+0

Просто интересно, учитывая объявление 'extern int (* a) [];', что ваш компилятор дает как 'sizeof a' и' sizeof * a'? У меня есть смутное чувство, что хотя бы одно из этих двух выражений не будет компилироваться, потому что оно пытается взять размер не полностью объявленного объекта. –

+0

Но это именно то, о чем вы говорили раньше: тип 'a' не может быть завершен. Это в цитате [ваш предыдущий вопрос] (http://stackoverflow.com/q/25967060). – dyp

ответ

1

Вкратце: 3-й вариант отличается тем, что, то типа вариабельных несовпадений указателей - ехЬегп объявляет указатель на массив целых чисел с неизвестным размером (неполный типа), и определение для той же переменной, но как указатель на массив из 5 int, которые являются разными (действительными) типами в соответствии со стандартом.

Подробно:

Первый сценарий staightforward: ехЬегп INT * а только декларирует существование переменной типа Int *. Вторая строка определяет ту же переменную.

второй сценарий: я снова прочитал стандарт, и это то, что он говорит:

Заявленный тип объекта массива может быть массив неизвестного размера и, следовательно, быть неполными в одном точка в блоке перевода и завершено позже; типы массивов в этих двух точках («массив неизвестных связанного Т» и «массив NT») различные типы

Я считаю, что это означает, что определение массива с индексом завершается предыдущая декларация переменный как массив с неизвестным размером (без индекса) - это то, что происходит в сценарии 2.

третьего сценария: Используя тот же смысл, что и от стандарта, типов массивов в эти две точки имеют разные типы. Следовательно, случай 3 завершился неудачно, потому что первая и вторая объявления затем объявили бы одну и ту же переменную указателя как указатель на разные типы, что приведет к ошибке «переопределения с разными типами»

[Отредактированный ответ после повторного чтения стандарта]

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