2009-12-04 2 views
3

Я имею функцию:Передача строки в качестве аргумента в C

int getparam(char *gotstring) 

и я передаю строку в качестве аргумента к нему, как char *sendstring = "benjamin"

Вместо вышеуказанного заявления я могу использовать,

int getparam(char gotstring[]) 

Вопрос: Какой из них лучше? И если мне нужно использовать int getparam(char gotstring[]), то каковы все остальные изменения, которые я должен внести в существующую функцию?

ответ

5

int getparam(char gotstring[]) и int getparam(char* gotstring) идентичны. Лично я бы рекомендовал последний синтаксис, потому что он лучше описывает, что происходит на самом деле. Функция getparam имеет указатель на строку; он не знает о фактическом размере массива. Однако это только мое мнение; либо будет работать.

1

В этом случае они означают одно и то же, и вам не нужно менять оставшуюся часть вашей функции. Но имейте в виду, что в целом массивы и указатели - это разные вещи.

1

Ничего лучше, на самом деле. Это то, с чем вам больше нравится. Идиоматично чаще используется char * arg вместо char arg [] (думаю, strcmp, strcpy и т. Д.).

+3

С точки зрения того, что на самом деле лучше, я всегда чувствовал, что синтаксис 'char mystring []' как параметр функции действительно вводит в заблуждение. Это исторически вызвало бесконечную путаницу среди неопытных программистов на С, которые ошибочно полагали, что информация о размере массива была сохранена в параметре функции, и что 'sizeof (mystring)' соответственно вернет размер массива, а не только размер указателя , Я лично считаю, что этот синтаксис не должен даже допускаться. –

1

Лучший способ принимать строковый аргумент является

int getparam(const char *gotstring); 

Вы можете назвать это с помощью символьной строки:

int main(void) 
{ 
    int x = getparam("is this a parameter string?"); 
    return 0; 
} 

Или массив символов:

int main(void) 
{ 
    char arg[] = "this might be a parameter string"; 
    int x = getparam(arg); 
    return 0; 
} 

использование const на указателе аргумента указывает вызывающему, что аргумент доступен только для чтения. функция, которая является очень приятной информацией.

1

Так как массивы передаются по ссылке в C и

int getparam(char *gotstring) 

и

int getparam(char gotstring[]) 

означает то же самое. Но первый используется больше. Так что использование этого делает вас хорошим гражданином C.

+0

Я склонен не соглашаться (особенно с объяснением менталитета стада). Эти конструкторы идентичны для компилятора, поскольку человек может (и должен ли я сказать) различать семантически: [] указывает на передачу массива, * передачу указателя на один элемент. – MaR

-1

Это называется передача по ссылке и как имя заявляет, что это значит передать только ссылку переменной (в данном случае char*).

Либо решения будут работать нормально, что на самом деле произойдет, так как при вызове void functionName(char* string) адрес первого char в памяти будет сохранен в стеке и передан в качестве параметра функции.

Следовательно, любое редактирование переменной внутри функции также отредактирует исходную переменную.В этом случае, поскольку вам нужно передать массив, у вас есть только этот параметр.

Для стандартных типов, таких как int, float вы можете отличить их:

void passByValue(int i); 
void passByReference(int &i); 

Разница заключается в том, что в первом значении случае копируется в стек при вызове функции, в то время как в последнем просто ссылка (указатель) до значения передается.

+0

Пожалуйста, я хотел бы знать причины, связанные с downvoting, только для того, чтобы понимать ошибки и пустоты, повторяя их. Сдвиг без причины бесполезен, особенно для меня. Спасибо .. – Jack

+0

Я не спустил вас вниз, поэтому я не могу его отменить, но предположительно, что downvoter раздражен тем, что вы путаете идею передачи по ссылке с передачей указателя по значению –

Смежные вопросы