Ошибки / предупреждения, передающие массивы int / char по ссылке - PullRequest
1 голос
/ 12 апреля 2010

Я работаю над программой, в которой я пытаюсь передать параметры по ссылке. Я пытаюсь передать массив 2D int и массив 1D char по ссылке.

Прототип функции:

void foo (int* (&a)[2][2], char* (&b)[4])

Вызов функции:

foo (a, b);

Однако, когда я компилирую код с флагами -ansi и -Wall на gcc, я получаю следующие ошибки:

foo.c: At top level:
error: expected ‘)’ before ‘&’ token
error: expected ‘;’, ‘,’ or ‘)’ before ‘char’
foo.c: In function ‘main’:
error: too many arguments to function ‘foo’

Я удалил оставшуюся часть кода моей программы и сосредоточился на битах, которые выбрасывают ошибки. Я искал в StackOverflow и пробовал разные способы передачи параметров, но ни один из них, похоже, не работает. ( Я использовал этот способ передачи параметров из обсуждения StackOverflow здесь .)

Не могли бы вы сказать мне, где я иду не так?

Ответы [ 2 ]

4 голосов
/ 12 апреля 2010

Ссылки не являются частью языка C, синтаксис, который вы пытаетесь использовать, работает только в C ++.

Между прочим, char* (&b)[4] будет ссылкой на массив из четырех char*, который представляет собой 1d массив char*, а не 1d массив char.

Обычно функция, принимающая 2d массив int с и 1d массив char, объявляется как

void foo(int a[][2], char b[]);

, что совпадает с:

void foo(int (*a)[2], char *b);
1 голос
/ 12 апреля 2010

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

Во-вторых, в вашем описании говорилось, что вы пытались передать массив 2D int, но в вашем объявлении предполагается, что это на самом деле массив int * указателей. Итак, что это должен был быть массив int или массив int *?

Предполагая, что вам нужен массив int (и массив char), вариант с указателями на массив вместо ссылок на массив может выглядеть следующим образом

void foo(int (*a)[2][2], char (*b)[4]);

В основном тот же синтаксис, который вы использовали, но с * вместо &. Внутри функции элементы массива будут доступны как (*a)[i][j] и (*b)[k].

Эта функция будет вызываться, как показано ниже

int a[2][2];
char b[4];
...
foo(&a, &b);
...