有多少种方法可以将char数组传递给C函数?

mig*_*WOZ 2 c arrays pointers argument-passing

  • foo(char *s)
  • foo(char *s[ ])
  • foo(char s[ ])

所有这些有什么区别?

有什么方法可以修改作为参数传递的数组的元素,就像我们传递intfloat使用&实际参数的值被修改一样?

zne*_*eak 5

在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仍然可以正常工作。(明显的缺点是数组必须具有确切数量的元素。)