2010-12-09 3 views
1

Это мой код:Почему не ошибка компилятора?

int a1[][3]={{1,2,3,4,5,6},{4,5,6,5}}; 

int (*q)[3]; 

q=a1; 

q является указателем на массив из 3 целых чисел. Но a1 не соответствует типу q. Однако назначение работает и ошибок не возникает.

Может ли кто-нибудь объяснить, почему?

+3

Было бы хорошо, если бы компилятор напечатал сообщение вместо того, чтобы мигать? – 2010-12-09 17:51:28

+0

Какой компилятор? Указатель на указатель должен быть `int ** p` irrc. – 2010-12-09 17:52:32

+0

Потому что это соответствует вам. – benjy 2010-12-09 17:53:04

ответ

4

типы действительно соответствуют. a1 - массив массивов длины-3 от ints. q - указатель на массив длиной 3 массива. Массив распадается на указатель в большинстве случаев; это один из них, так что все в порядке!

1

Указывает адрес первого элемента a1 на указатель q.

1

Типы равны - когда вы используете a1 в заявлении о присваивании, он превращается в указатель и типы предварительного соответствия.

Много больше информации:

http://c-faq.com/aryptr/index.html

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