mig*_*WOZ 2 c arrays pointers argument-passing
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[]
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,该数组都将转换为指向其第一个元素的指针。
指向数组的指针解决方案不太常见。它需要以这种方式进行原型设计(注意周围的括号*s
):
void foo(char (*s)[]);
Run Code Online (Sandbox Code Playgroud)
如果没有括号,则需要一个char指针数组。
在这种情况下,要调用该函数,您需要传递数组的地址:
foo(&array);
Run Code Online (Sandbox Code Playgroud)
您还需要在foo
每次访问数组元素时都取消引用指针:
void foo(char (*s)[])
{
char c = (*s)[3];
}
Run Code Online (Sandbox Code Playgroud)
那样,并不是特别方便。但是,这是允许您指定数组长度的唯一形式,您可能会发现这很有用。这是我个人的最爱之一。
void foo(char (*s)[4]);
Run Code Online (Sandbox Code Playgroud)
然后,如果您尝试传递的数组不完全具有4个字符,则编译器将警告您。此外,sizeof
仍然可以正常工作。(明显的缺点是数组必须具有确切数量的元素。)