我正在编写一个函数:
int getparam(char *gotstring)
我可以向它传递一个字符串参数,例如 char *sendstring = "benjamin"
除了上述声明,我还可以使用以下方式:
int getparam(char gotstring[])
问题:哪一个更好?如果我必须使用int getparam(char gotstring[])
,那么我还需要对现有函数进行哪些其他更改?
int getparam(char gotstring[])
和int getparam(char* gotstring)
是相同的。个人建议使用后一种语法,因为它更好地描述了实际发生的情况。getparam
函数只有对字符串的指针;它不知道实际数组大小。然而,这只是我的观点;任何一种方式都可以。
接受字符串参数的最佳方法是
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
在参数指针上的使用表明该参数在函数内部是只读的,这为调用者提供了非常好的信息。
其实两者都没有更好的,取决于你自己更熟悉哪种方式。从习惯用法上来说,使用 char *arg 要比 char arg[] 更为普遍(例如 strcmp、strcpy 等函数)。
由于在C语言中数组是通过引用传递的
int getparam(char *gotstring)
并且
int getparam(char gotstring[])
意思是相同的。但第一个更常用。因此使用它会让你成为一名优秀的C语言程序员。
这被称为按引用传递,顾名思义,它意味着仅传递变量的引用(在本例中是char*
)。
任何一种解决方案都可以正常工作,实际上,当调用void functionName(char* string)
时,内存中第一个char
的地址将保存在堆栈上并作为参数传递给函数。
因此,在函数内部对变量进行的任何编辑都会同时编辑原始变量。 在这种情况下,由于需要传递数组,因此只有这个选项。
对于像int
、float
这样的标准类型,您可以区分它们:
void passByValue(int i);
void passByReference(int &i);
char mystring[]
语法非常具有误导性。这在经验不足的 C 程序员中历史上曾引起过无数的困惑,他们错误地认为数组大小信息被保留在函数参数中,因此sizeof(mystring)
将返回数组的大小而不仅仅是指针的大小。我个人认为这种语法甚至不应该被允许。 - Charles Salvia