Передача массива C в качестве параметра функции char * - PullRequest
7 голосов
/ 08 апреля 2009

У меня есть некоторый код, который я выполняю со следующим объявлением переменной:

char tmpry[40];

Используется с этой функцией:

char *SomeFunction(char *tmpryP) {
   // Do stuff.
}

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

SomeFunction(&tmpry[0]);

Я чертовски уверен, что это так же, как:

SomeFunction(tmpry);

Я даже проверил, что указатель char * в SomeFunction заканчивается указанием на ту же область памяти, что и массив, в обоих случаях.

Мой вопрос - проверка работоспособности относительно того, идентичны ли эти два вызова функции (и, следовательно, оригинальный программист был просто противным)?

Ответы [ 8 ]

12 голосов
/ 08 апреля 2009

они точно такие же.

someArray[i]

означает ровно

*(someArray + i)

где someArray во втором случае - указатель на ячейку памяти. Точно так же

&someArray[i]

означает ровно

(someArray + i)

В обоих этих случаях термины являются указателями на ячейки памяти.

12 голосов
/ 08 апреля 2009

Два эквивалентны, и я думаю, SomeFunction (tmpry); более читабелен.

7 голосов
/ 08 апреля 2009

Это может быть значимым, если SomeFunction является макросом и принимает "sizeof" одного из своих аргументов, поскольку sizeof(tmpry) необязательно может быть равно sizeof(&tmpry[0]).

В остальном, как отмечали другие, они точно такие же.

5 голосов
/ 09 апреля 2009

В разделе Часто задаваемые вопросы по программированию , посвященном массивам и указателям , рассматриваются эти (и многие другие распространенные вопросы и путаницы в Си.

3 голосов
/ 08 апреля 2009

Как и все остальные, эти два обозначения эквивалентны.

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

SomeFunction(&tmparry[0]);
SomeFunction(&tmparry[10]);
SomeFunction(&tmparry[NNN]);

Где в идеале все константы (магические числа) должны быть константами enum (или #define).

1 голос
/ 08 апреля 2009

Декларация

int a [10]; int * pa;

Существует одно различие между массивом и указателем, которое необходимо учитывать. Указатель является переменной, поэтому pa = a и pa ++ допустимы. Но имя массива не является переменной; конструкция типа a = pa и a ++ запрещена

Как параметры формата в определении функции, char s [] а также символ * с эквивалентны;

От: Язык программирования C 2-й , стр. 99-100

1 голос
/ 08 апреля 2009

Эти два варианта эквивалентны и проходят так

SomeFunction(tmpry);

выглядит чище.

1 голос
/ 08 апреля 2009

Оба одинаковы, хотя второй выглядит красиво и проясняет намерение передать массив функции. Но как SomeFunction узнает размер передаваемого массива, всегда ли он принимается равным 40? Я чувствую, что лучше передать размер также в качестве параметра для SomeFunction.

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