Как передать char (*) ([long unsigned int]) в качестве параметра в C? - PullRequest
0 голосов
/ 03 марта 2012

У меня есть тип переменной:

char (*p)[12] = calloc(n, sizeof(*p));

Мне нужно, чтобы переменная оставалась такой, но у меня возникают проблемы с передачей ее в качестве параметра из-за типа функции, выдающего мне ошибки:

void myMethod(char *p) { ... }

Что я могу использовать в myMethod в качестве параметра для этой работы?

Ответы [ 4 ]

4 голосов
/ 03 марта 2012

Что я могу использовать в myMethod в качестве параметра для этой работы

Возможно это:

void myMethod(char (*p)[12])
2 голосов
/ 04 марта 2012

Используйте для параметра тот же тип, что и для переменной:

void myMethod(char (*p)[12])
{
  // do something with p
}
...
char (*p)[12] = calloc(n, sizeof *p);
myMethod(p);

Помните, что p является указателем на массив из 12 элементов char, а не простым указателемchar.Таким образом, тип p[i] будет char [12] (который в большинстве случаев будет уменьшаться до char *).

0 голосов
/ 03 марта 2012
char (*p)[12] = ...

С предыдущим у вас есть НЕ , определенный массив из 12 элементов, каждый из которых является указателем на символ НО указатель в массив с 12 символами.

Как объяснено в следующих строках:

int *a[3];

Начните с. Посмотрите направо, скажите массив размером 3. Посмотрите налево и скажите указатель. Посмотри правильно и ничего не увидишь. Посмотрите налево и скажите int. Все вместе вы говорите, что это массив указателей размера 3 на int.

Добавление скобок - это когда странно:

int (*a)[3];

Скобки меняют порядок, как в выражении. Когда вы смотрите справа после a, вы видите правую скобку, которую вы не можете перепрыгнуть, пока не посмотрите налево. Следовательно, вы бы сказали, что a является указателем на массив из 3-х целых.

Проверьте эти ссылки для лучшего объяснения:


Тем не менее, если вы хотите передать массив в функцию, вы можете либо скопировать его, либо, поскольку это массив, передать указатель на первый элемент (вы можете просто сделать это, используя имя массива):

myMethod( p ) <- how you call the function

Лично я предпочел бы последний случай, поскольку вы передаете функции простой указатель, а не массив в виде копии всех ее элементов

0 голосов
/ 03 марта 2012

Типичная идиома C состоит в том, чтобы передать параметр char* и size_t (или unsigned int или любой другой эквивалентный). Тогда контракт функции заключается в том, что она будет учитывать аргумент size_t как длину массива / буфера.

Если вы должны настаивать на том, чтобы указатель не изменялся, вы используете квалификатор const.

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