foo(char *s)
foo(char *s[ ])
foo(char s[ ])
所有这些有什么区别?
有什么方法可以修改作为参数传递的数组的元素,就像我们使用int
传递float
或&
并修改实际参数的值一样?
最佳答案
在C语言中,无法按值传递数组。您列出的每个有效解决方案(不幸的是不包括#2)将不仅让您使用,而且还会迫使您修改原始阵列。
由于自变量衰减,foo(char* s)
和foo(char s[])
彼此完全等效。在这两种情况下,都使用名称传递数组:
char array[4];
foo(array); // regardless of whether foo accepts a char* or a char[]
在这两种情况下,该数组都将转换为指向其第一个元素的指针。
指向数组的指针解决方案不太常见。它需要以这种方式进行原型设计(注意
*s
周围的括号):void foo(char (*s)[]);
如果没有括号,则需要一个char指针数组。
在这种情况下,要调用该函数,您需要传递数组的地址:
foo(&array);
每当您要访问数组元素时,还需要从
foo
解引用指针:void foo(char (*s)[])
{
char c = (*s)[3];
}
那样,并不是特别方便。但是,这是允许您指定数组长度的唯一形式,您可能会发现这很有用。这是我个人的最爱之一。
void foo(char (*s)[4]);
然后,如果您尝试传递的数组不完全包含4个字符,则编译器将警告您。此外,
sizeof
仍可以按预期工作。 (明显的缺点是数组必须具有确切数量的元素。)
关于c - 有多少种方法可以将char数组传递给C函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58144180/