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

标签 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[]


在这两种情况下,该数组都将转换为指向其第一个元素的指针。

指向数组的指针解决方案不太常见。它需要以这种方式进行原型设计(注意*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/

相关文章:

C++ 外部对象数组

C 预处理器令人困惑的行为

c++ - 换行符(十六进制 0x0A)可以合法地嵌入到 UTF8 中吗?

java - 可打包 : Double Array , 日历和位图

javascript - 如何用它自己的元素和另一个数组的元素初始化一个javascript数组?

c - 如何将一系列整数分配给结构中的指针var

c - C 中指向常量的指针

抛弃指向 const 的指针数组中的常量性,以及有关 C 的其他问题

c++ - C/C++ : source file after preprocessing-Diab compiler?

python - 将 c 结构体返回给 python 时出错