在C语言中将字符串作为参数传递

5

我正在编写一个函数:

int getparam(char *gotstring)

我可以向它传递一个字符串参数,例如 char *sendstring = "benjamin"

除了上述声明,我还可以使用以下方式:

int getparam(char gotstring[])

问题:哪一个更好?如果我必须使用int getparam(char gotstring[]),那么我还需要对现有函数进行哪些其他更改?

6个回答

7

int getparam(char gotstring[])int getparam(char* gotstring)是相同的。个人建议使用后一种语法,因为它更好地描述了实际发生的情况。getparam函数只有对字符串的指针;它不知道实际数组大小。然而,这只是我的观点;任何一种方式都可以。


3

接受字符串参数的最佳方法是

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
在这种情况下,它们的意思相同,您不需要更改函数的其余部分。但请注意,在一般情况下,数组和指针是不同的东西。

1

其实两者都没有更好的,取决于你自己更熟悉哪种方式。从习惯用法上来说,使用 char *arg 要比 char arg[] 更为普遍(例如 strcmp、strcpy 等函数)。


4
就实际哪个更好而言,我一直觉得函数参数中的 char mystring[] 语法非常具有误导性。这在经验不足的 C 程序员中历史上曾引起过无数的困惑,他们错误地认为数组大小信息被保留在函数参数中,因此 sizeof(mystring) 将返回数组的大小而不仅仅是指针的大小。我个人认为这种语法甚至不应该被允许。 - Charles Salvia

1

由于在C语言中数组是通过引用传递的

int getparam(char *gotstring)

并且

int getparam(char gotstring[])

意思是相同的。但第一个更常用。因此使用它会让你成为一名优秀的C语言程序员。


1
我倾向于不同意(特别是关于群体心理的解释)。对于编译器来说,这些结构是相同的,但对于人类来说,它们在语义上可能会有所不同(我认为应该有所不同):[]表示传递一个数组,*表示传递一个指向单个元素的指针。 - MaR

-1

这被称为按引用传递,顾名思义,它意味着仅传递变量的引用(在本例中是char*)。

任何一种解决方案都可以正常工作,实际上,当调用void functionName(char* string)时,内存中第一个char的地址将保存在堆栈上并作为参数传递给函数。

因此,在函数内部对变量进行的任何编辑都会同时编辑原始变量。 在这种情况下,由于需要传递数组,因此只有这个选项。

对于像intfloat这样的标准类型,您可以区分它们:

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

区别在于,在前一种情况下,在调用函数时将值复制到堆栈中,而在后一种情况下,只传递对该值的引用(指针)。

请问可以告诉我下投票的原因吗?这样我就能了解我的错误并避免重复。没有附带原因的投票是毫无意义的,尤其是对我来说。谢谢。 - Jack
我没有给你点踩,所以我无法取消它,但是可能点踩的人很烦恼你混淆了按引用传递和按值传递指针的概念。 - Charles Salvia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接