как передать "указатель на массив" в функции - PullRequest
3 голосов
/ 01 августа 2011

Это моя функция

int mkvCopyWord(uint8_t *pBuffer, UINT8 temp):

main() 
{
uint8_t a[10];
mkvCopyWord(&a,10);
}

предупреждение говорит: примечание: ожидается ‘uint8_t *’, но аргумент имеет тип ‘uint8_t (*) [10]’

как убрать это предупреждение ..?

Ответы [ 4 ]

8 голосов
/ 01 августа 2011

Ваш синтаксис для передачи указателя на массив в порядке.Но вы пытаетесь передать его чему-то, что не не хочет указатель на массив.Он просто хочет указатель на начальный элемент.Самый простой способ получить это - позволить имени массива уменьшаться до указателя, таким образом, mkvCopyWord(a, 10).Функция будет предполагать, что указатель, который вы ей указываете, указывает на некоторую последовательность uint8_t s где-то - поэтому вы должны передать размер массива в качестве другого параметра, потому что он не знает о массиве, у него есть только некоторый адресв памяти, где находится массив.

5 голосов
/ 01 августа 2011

Вам не нужно брать адрес массива, поскольку он неявно преобразуется в указатель:

int mkvCopyWord(uint8_t *pBuffer, UINT8 temp):

main() 
{
  uint8_t a[10];
  mkvCopyWord(a,10);
}
4 голосов
/ 01 августа 2011
int main(void) //main() without return type isn't a good practice  
{
   uint8_t a[10];
   mkvCopyWord(&a,10);
   return 0; 
}

Здесь вы передаете параметр типа «указатель на массив из 10 uint8_t». Ваша функция, однако, объявляется с указателем на int. Чтобы этот синтаксис работал, вам нужно изменить объявление вашей функции, чтобы взять указатель на массив из 10 uint8_t

void mkvCopyWord(uint8_t (*parr)[10], int n)

Это все о синтаксисе и системе типов. Что касается вашей реальной проблемы, вам нужно передать указатель на первый элемент вашего массива.

mkvCopyWord(&a[0],10);

Однако массив в любом случае неявно преобразуется в него, поэтому вам не нужно беспокоиться. Вы используете следующее:

mkvCopyWord(a,10);  

НТН

3 голосов
/ 01 августа 2011

Удалить амперсанд в mkvCopyWord(&a,10):

int mkvCopyWord(uint8_t *pBuffer, UINT8 temp):

main() 
{
  uint8_t a[10];
  mkvCopyWord(a,10); /* <<< removed the ampersand */
}

Информацию об эквивалентности указателей и массивов можно найти в C FAQ .

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...