c - C 编程字符数组或字符串作为函数参数
问题描述
例如,如果我定义一个数组
char string[20] = "something";
和功能
void f(char* somestring[])
这是什么,一个地址或一个数字或什么以及如何使用它?它用于哪些目的?
解决方案
string
是一个 20 元素的数组char
- 可以存储最多 19 个字符的字符串(需要为字符串终止符保留一个元素),或者可以存储不代表字符串的 20 个字符的序列(如哈希值或者其他的东西)。
除非它是sizeof
or 或一元运算&
符的操作数, “N-element array of”类型的表达式T
将被转换(“decay”)为“pointer to T
”类型的表达式,其值将是数组的第一个元素。
因此,如果您string
作为参数传递给函数,如下所示:
f( string );
函数实际接收的是一个指针值:
void f( char *somestring ) { ... }
在函数参数声明的上下文中(并且仅在该上下文中),T a[N]
并且T a[]
都被视为T *a
,因此您可以声明f
为
void f( char somestring[20] ) { ... }
或者
void f( char somestring[] ) { ... }
也是。
下标运算符[]
被定义为处理指针表达式以及数组表达式,因此您仍然可以像任何其他数组一样使用[]
索引:somestring
void f( char *somestring )
{
int i = 0;
while ( somestring[i++] )
{
// do something interesting with somestring[i]
}
}
所以,如果void f( char *somestring )
与 相同void f( char somestring[] )
,那么我们如何理解
void f( char *somestring[] )
?
在这种情况下,很明显这somestring
是一个指向 的指针 char
数组,例如
char *strings[] = {"foo", "bar", "bletch", ... };
每个都strings[i]
存储相应字符串文字的地址,而不是字符串本身的内容。通过上述相同的规则,原型也可以写成
void f( char **somestring ) { ... }
或者
void f( char *somestring[N] ) { ... }
在这种情况下,一件事somestrings
不是2D 数组。如果已经声明char
strings
#define N ... // number of strings
#define M ... // maximum length of string
char strings[N][M+1] = {"foo", "bar", "bletch", ... };
那么,如果我们传递strings
到f
,它会“衰减”到
void f( char (*somestrings)[M+1] ) { ... }
的类型strings
是“N 元素数组的 M+1 元素数组char
”,因此表达式“衰减”为“指向 M+1 元素数组的指针char
”。
推荐阅读
- java - 我的程序没有显示代码?
- python - 如何将多维数组字符串转换回 Python 中的数组?
- entity-framework - 在 EF Core 中处理 DbUpdateConcurrencyException
- plotly - 如何在 plotly 上根据 pandas DF 列分配离散标记颜色?
- c++ - 使用 QVBoxLayout 或 QListWidgetItem 会导致 DLL 内的 QApplication::exec() 出现“访问冲突”异常
- git - 如何使用 `git log` 获得有意义的修订图
- npm - 突然 gulp 命令在 spfx 解决方案中无法识别
- python - 如何使用 while 循环每月将值增加 5%?
- html - 响应项目在 Flask 本地 Web 服务器中不起作用
- java - 通过在迭代相同的 ArrayList 时删除 ArrayList 的倒数第二个元素来预期 ConcurrentModificationException