Передача строки в функцию в 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];.