Diel
@Diel

Есть ли разница между char* и char[число] при передаче аргументов функции?

Есть к примеру такой код:
void process_ptr(char* ptr) {
  for (int i = 0; i < 10; i++)
    ptr[i]++;
}

void process_array(char array[10]) {
  for (int i = 0; i < 10; i++)
    array[i]++;
}

int main() {
  char* ptr = "0123456789";
  char array[10] = "asdfasdfas";

  process_ptr(ptr);
  process_array(array);

  return 0;
}

Интересует вопрос есть ли разница в том, как компилятор обрабатывает эти аргументы? push'ится ли копия массива на стек, или передается его указатель как в первом случае? Если не считать того, что компилятор будет ругаться если не совпадают размеры или пробую переполнить.
  • Вопрос задан
  • 463 просмотра
Решения вопроса 1
longclaps
@longclaps
передается его указатель - да
Если не считать того, что компилятор будет ругаться если не совпадают размеры или пробую переполнить - именно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@abcd0x00
Разницы нет. Вообще, принято скобки писать просто пустыми, без числа. Но в идеале, чисто стилистически для повышения читаемости, когда передаётся указатель, пишется указатель, а когда передаётся массив, пишется массив.

Вот пример:
Обычно пишут так
int main(int argc, char *argv[])
Но это можно записать и так
int main(int argc, char **argv)
Так как разницы нет.
Но пишут первым способом, чтобы подчеркнуть для читателя исходника, что там массив указателей, а не просто указатель на указатель какой-то непонятный (можно его двигать, или нельзя его двигать - неясно). А в первом варианте читателю сразу понятно, что там можно применять argv++, так как движение по массиву происходит.
Ответ написан
Комментировать
@alex-t
Прогр. в команде rco.ru
Проблема в том, что именно компилятор НЕ будет ругаться...
Передавая (точно так же) массив ( process_array(array);) можно либо явно контролировать длину массива
void process_array4 (char (&array)[4]) {
  for (int i = 0; i < 4; i++)
    array[i]++;
}

Либо написать функцию, которая скомпилируется с нужной длиной
template <size_t N>
void process_arrayN (char (&array)[N]) {
  for (int i = 0; i < N; i++)
    array[i]++;
}
Ответ написан
Комментировать
BacCM
@BacCM
C++ почти с рождения
Компилятор скорее всего ругаться не будет, но ты можешь зато использовать sizeof, хотя это достаточно спорный момент, т.к. всё равно в аргументах есть явный размер.
Не помню чтобы реально хоть раз была практическая необходимость "передавать" массив заранее известного размера. Только если этот массив, какие-нибудь координаты или пара значений.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы