我有一个功能:
int getparam(char *gotstring)
我正在向它传递字符串参数,例如char *sendstring = "benjamin"
而不是我可以使用的上述声明,
int getparam(char gotstring[])
问题:哪一个更好?如果我必须使用int getparam(char gotstring[])
那么我必须对现有函数做出哪些其他更改?
答案 0 :(得分:6)
int getparam(char gotstring[])
和int getparam(char* gotstring)
完全相同。就个人而言,我会推荐后一种语法,因为它更好地描述了实际发生的事情。 getparam
函数只有一个指针到字符串;它不了解实际的数组大小。但是,这只是我的意见;要么会奏效。
答案 1 :(得分:1)
在这种情况下,它们的含义相同,您无需更改函数的其余部分。但请注意,通常,数组和指针是不同的东西。
答案 2 :(得分:1)
两者都不是更好,真的。这是你更舒服的东西。在惯用法中,更常见的是使用char * arg而不是char arg [](想想strcmp,strcpy等)。
答案 3 :(得分: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
向调用者指示该参数在函数内是只读的,这是非常好的信息。
答案 4 :(得分:1)
由于数组是通过C中的引用发送的
int getparam(char *gotstring)
和
int getparam(char gotstring[])
意思相同。 但是第一个用得更多。所以使用它会让你成为一名优秀的C公民。
答案 5 :(得分:-1)
这被称为通过引用传递以及名称如何表示它意味着传递仅仅是变量的引用(在本例中为char*
)。
任何一个解决方案都可以正常工作,实际发生的是,当调用void functionName(char* string)
时,内存中第一个char
的地址将保存在堆栈中并作为参数传递给函数
因此,对函数中的变量的任何编辑都会编辑原始变量。在这种情况下,由于你需要传递一个数组,你只需要这个选项。
对于int
,float
等标准类型,您可以区分它们:
void passByValue(int i);
void passByReference(int &i);
不同之处在于,在前一种情况下,在调用函数时将值复制到堆栈中,而在后者中只传递值的引用(指针)。