Передача строки в функцию в C - с указателями или без них?
Когда я передаю строку функции, я иногда использую
char *functionname(char *string name[256])
и иногда я использую его без указателей (например:
char functionname(char string[256])
Мой вопрос в том, когда мне нужно использовать указатели? Часто я пишу программы без указателей, и это работает, но иногда это не так.
Ответы
Ответ 1
Принятое соглашение о передаче C-строк в функции заключается в использовании указателя:
void function(char* name)
Когда функция изменяет строку, вы также должны передавать длину:
void function(char* name, size_t name_length)
Ваш первый пример:
char *functionname(char *string name[256])
передает массив указателей на строки, которые вам совсем не нужны.
Второй пример:
char functionname(char string[256])
передает массив символов. Размер массива здесь не имеет значения, и параметр все равно будет распадаться на указатель, поэтому это эквивалентно:
char functionname(char *string)
См. также этот вопрос для более подробной информации о аргументах массива в C.
Ответ 2
Предполагая, что вы хотели написать
char *functionname(char *string[256])
Здесь вы объявляете функцию, которая принимает массив из 256 указателей на char
в качестве аргумента и возвращает указатель на char. Здесь, с другой стороны,
char functionname(char string[256])
Вы объявляете функцию, которая принимает массив из 256 char
в качестве аргумента и возвращает char
.
Другими словами, первая функция принимает массив строк и возвращает строку, а вторая берет строку и возвращает символ.
Ответ 3
Массив - это указатель. Он указывает на начало последовательности "объектов".
Если мы это сделаем: ìnt arr[10];
, тогда arr
является указателем на ячейку памяти, из которой следуют десять целых чисел. Они не инициализированы, но выделена память. Это точно так же, как и int *arr = new int[10];
.