




Выражение &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. Комментарии продолжения обсуждения могут быть удалены.