首页 > 解决方案 > C 编程字符数组或字符串作为函数参数

问题描述

例如,如果我定义一个数组

char string[20] = "something";

和功能

void f(char* somestring[])

这是什么,一个地址或一个数字或什么以及如何使用它?它用于哪些目的?

标签: carraysstringfunctionpointers

解决方案


string是一个 20 元素的数组char- 可以存储最多 19 个字符的字符串(需要为字符串终止符保留一个元素),或者可以存储不代表字符串的 20 个字符的序列如哈希值或者其他的东西)。

除非它是sizeofor 或一元运算&符的操作数, “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 数组。如果已经声明charstrings

#define N ... // number of strings
#define M ... // maximum length of string

char strings[N][M+1] = {"foo", "bar", "bletch", ... };

那么,如果我们传递stringsf,它会“衰减”到

void f( char (*somestrings)[M+1] ) { ... }

的类型strings是“N 元素数组的 M+1 元素数组char”,因此表达式“衰减”为“指向 M+1 元素数组的指针char”。


推荐阅读