【问题标题】:C programming array of characters or string as function parameterC 编程字符数组或字符串作为函数参数
【发布时间】:2019-03-18 20:21:18
【问题描述】:

如果我例如定义一个数组

char string[20] = "something";

和功能

void f(char* somestring[])

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

【问题讨论】:

标签: c arrays string function pointers


【解决方案1】:

首先,地址是一个数字。然后,输入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-th 字符。
  3. 使用**foo 设置char 值,使用*foo 更改指针指向的字符。

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

【讨论】:

    【解决方案2】:

    stringchar 的 20 元素数组 - 您可以存储最多 19 个字符的 字符串(需要为字符串终止符保留一个元素),或者您可以存储not 表示字符串的 20 个字符序列(如哈希值或其他内容)。

    除非它是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 的二维数组。如果 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 元素数组”,因此表达式“衰减”为“char 的 M+1 元素数组的指针” .

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-15
      • 1970-01-01
      • 1970-01-01
      • 2018-03-14
      • 1970-01-01
      • 2012-07-30
      • 2016-09-11
      • 1970-01-01
      相关资源
      最近更新 更多