Выражение &a
имеет тип «указатель на массив unsigned char
размера 31», т.е. unsigned char (*)[31]
это отличается от объявленного параметра unsigned char **
, и первый не может быть преобразован во второй.
Предположительно, вы хотите работать с массивом изнутри функции. В этом случае просто измените тип параметра на unsigned char *
и передайте a
непосредственно в функцию:
void f(unsigned char *arr)
{
unsigned char *p = arr;
}
int main()
{
unsigned char a[31];
f(a);
}
Это разрешено, поскольку массив при использовании в выражении (кроме операнда &
) превращается в указатель на свой первый элемент. В частности, массив типа unsigned char[31]
распадается на указатель типа unsigned char *
при передаче функции.
Чтобы проиллюстрировать это, можно попробовать сравнить sizeof( *(&a) )
и ``sizeof( *p )`: godbolt.org/z/xe1f7zGcW
У вас уже есть ответ в дюпе.
a
— это массив из 31 unsigned char
(unsigned char[31]
).
&a
— указатель на такой массив (unsigned char (*)[31]
).
Вы пытаетесь «присвоить» это arr
, что является указателем на указатель на unsigned char
.
&a
не указывает на указатель. &a
несовместим с unsigned char **
.
Обычный подход: (Указатель на первый элемент)
void f( unsigned char *arr ) {
unsigned char *p = arr;
}
int main( void ) {
unsigned char a[31];
f( a ); // Short for `f( &(a[0]) )`.
}
Альтернативный подход: (Указатель на массив)
void f( unsigned char (*arr)[31] ) {
unsigned char *p = *arr; // Short for `p = &((*arr)[0])`.
}
int main( void ) {
unsigned char a[31];
f( &a );
}
Второй вариант хорош, но что делать, если я не хочу указывать размер массива?
@user180574 void f( size_t n, unsigned char (*arr)[n] )
Это работает с gcc, но g++ жалуется на «ошибку: использование параметра вне тела функции перед токеном ‘]’»
Вы сказали, что используете C, но g++ не является компилятором C. Не пытайтесь скомпилировать код C с помощью g++.
Комментарии перенесены в чат ; пожалуйста, не продолжайте обсуждение здесь. Прежде чем оставлять комментарий под этим, пожалуйста, ознакомьтесь с целями комментариев . Комментарии, которые не требуют разъяснений или предложений по улучшению, обычно размещаются в виде ответа , в Meta Stack Overflow или в Stack Overflow Chat. Комментарии продолжения обсуждения могут быть удалены.