字符或字符串作为函数参数的C编程数组

时间:2019-03-18 20:21:19

标签: c arrays string function pointers

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

char string[20] = "something";

和功能

void f(char* somestring[])

这是什么,地址或号码,或者我该如何处理?它用于什么目的?

2 个答案:

答案 0 :(得分:0)

首先,地址是数字。然后,键入char *foo[](实际上只是char **foo)具有几种等效解释。

  1. foo是一个双索引的char数组。
  2. foo是指向char数组的指针(即,如果字符串为null,则终止,就像字符串文字一样)。
  3. ,也许是最罕见的用例,foo是一个指向char值的指针。

它也可以以多种方式使用。

  1. foo是一个char二维数组;然后foo[x][y]将在数组x和列y的数组中检索您的字符。
  2. foo是指向字符串的指针。然后(*foo)[x]为您提供字符串的第x个字符。
  3. 使用**foo设置char值,并使用*foo更改指针指向的字符。

编辑:当然,所有这些都是可组合的并且是等效的。例如,foo[0][0]只是(*foo)[0],也就是**foo

答案 1 :(得分:0)

stringchar的20个元素的数组-您可以存储最多19个字符的 string (需要为字符串终止符保留一个元素),或者您可以存储20个字符的序列,这些字符 not 不能代表字符串(例如哈希值等)。

除非它是sizeof或一元&运算符的操作数,否则类型为“ T的N元素数组”的表达式转换(“衰减”)为“指向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不是 的一件事是char的2D数组。如果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的类型是“ char的M + 1元素数组的N元素数组”,因此表达式“衰变”为“指向M的M + 1元素数组的指针” char”。