Ошибка указателя C : не удается преобразовать «int (*)[10]» в «int*» при инициализации

#arrays #c #pointers #compiler-errors #implicit-conversion

Вопрос:

Я выполняю следующий код.

 #include lt;stdio.hgt;  int main()  {  int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  int *p =a;   }  

Но моя консоль показывает эту ошибку.

 cannot convert 'int (*)[10]' to 'int*' in initialization  

Я не знаю, почему. Кто-нибудь может сказать мне причину и решение?

Вот прилагаемый скриншот.[https://imgur.com/a/U94vtKG]

Комментарии:

1. Попробуй p = amp;a[0]; . Действительно ли это истинный код, который публикуется?

2. Хорошо, программа запущена. Но проблема (не удается преобразовать «int ( )[10]» в » int » при инициализации) все еще отображается на вкладке проблема. Проверьте изображение imgur.

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

4. На изображении imgur файл кода помечен как измененный, т. е. вы не сохранили содержимое файла. Вы уверены, что компилируете то, что видите?

5. Код был скомпилирован, но он все еще показывал проблему. Может быть, ошибка IDK.

Ответ №1:

a это 10 int указателей. Вы не можете назначить один int указатель 10 int указателям.

Если вы хотите p указать на первый элемент a , измените:

 int *p = a;  

Для:

 int *p = amp;a[0]  

Комментарии:

1. Хорошо, программа запущена. Но проблема (не удается преобразовать «int ()[10]» в » int » при инициализации) все еще отображается на вкладке проблема. Проверьте изображение imgur.

Ответ №2:

Сообщение об ошибке

не удается преобразовать «int ()[10]» в » int » при инициализации

означает, что на самом деле вместо этого правильного объявления

 int *p = a;  

ты написал

 int *p = amp;a;  

Или если в реальности массив a объявлен как двумерный массив

 int a[][10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};  

тогда вам нужно написать

 int ( *p )[10] = a;  

То есть ваш представленный код в вопросе не соответствует сообщению об ошибке.

Обычно такая ошибка возникает, когда функция, объявленная, например, как

 void f( int *a );  

называется как

 f( amp;a );  

вместо того, чтобы называть это так

 f( a );  

где a находится одномерный массив.

Комментарии:

1. В чем же тогда проблема?

2. Обозначение массива @Zeph_The_Hungry_Loli, используемое в выражениях за редкими исключениями, преобразуется в указатель на его первый элемент. Таким образом, если у вас есть одномерный массив целых чисел, то он преобразуется в указатель типа int*, если у вас есть двумерный массив, такой как int a[][10], то его элемент имеет тип int[10], и указатель на этот элемент будет выглядеть как int ( *p )[10]. Похоже, вы где-то допустили опечатку. Например, вы можете вызвать функцию типа f( amp;a ); в то время как параметр функции имеет тип int *

3. Таким образом, обозначения массива-это в основном указатели в двух словах, которые указывают на первый элемент массива? Допустим, a[]={1,3,4,5}. Итак, если я напечатаю только a (не[0] ), получу ли я значение адреса или первый элемент? Или все, что я говорю, совершенно неправильно? Извините, если это звучит глупо, но я довольно новичок в программировании.

4. @Zeph_The_Hungry_Loli Ты прав. Фактически, указатель массива, неявно преобразованный в указатель, дает выражение, эквивалентное выражению amp;a[0].