代码之家  ›  专栏  ›  技术社区  ›  Tintenfisch

传递参数:array与C和C中的*&array和&array[0]之间的差异++

  •  2
  • Tintenfisch  · 技术社区  · 1 年前

    以下内容在C中等效吗?

    差异仅在最后一行( AnyFunction )。

    A.

    static void AnyFunction(unsigned char *array);
    unsigned char array[32] = "";
    
    AnyFunction(array);
    

    B

    static void AnyFunction(unsigned char *array);
    unsigned char array[32] = "";
    
    AnyFunction(*&array);
    

    C

    static void AnyFunction(unsigned char *array);
    unsigned char array[32] = "";
    
    AnyFunction(&array[0]);
    

    如果其中任何一个是等效的,C++也适用吗?

    请参阅上面的问题和代码示例。

    1 回复  |  直到 1 年前
        1
  •  7
  •   dbush    1 年前

    最终的结果是一样的,尽管它们如何到达那里略有不同。

    在第一种情况下:

    AnyFunction(array);
    

    array 传递给函数时,衰减到指向其第一个成员的指针,特别是从类型 unsigned char [32] unsigned char * 这与函数所期望的相匹配。

    在第二种情况下:

    AnyFunction(*&array);
    

    的地址 大堆 是,给我们一个类型的表达式 unsigned char (*)[32] 即指向数组的指针,然后 * 运算符取消引用该指针,从而生成类型为的数组表达式 无符号字符[32] 然后,与第一种情况一样,该数组衰减到指向其第一个元素的指针。

    在最后一种情况下:

    AnyFunction(&array[0]);
    

    数组索引运算符给我们一个左值,它是数组的第一个元素 & 运算符为我们提供该元素的地址,然后将结果传递给函数。

    在这三种情况下,都会向函数传递一个指向 大堆

        2
  •  0
  •   Luis Colorado    1 年前

    这三种情况相当:

    1. 从法律上讲,第一个(数组名称本身)是 根据定义 数组的第一个元素的地址,因此表达式中的值本身是指向一个数组元素的指针( unsigned char * 类型)。

    2. 在第二种情况下,使用数组的地址 &array ,属于类型 unsigned char (*)[32] (指向32个无符号char元素的数组的指针),并且当由 * 它转换为数组本身,类型为 unsigned char [32] (由32个无符号字符组成的数组),因此当在表达式中使用时,它会变成(根据1中的相同解释)指向数组第一个元素的指针,从而产生 无符号字符* 指针值。

    3. 在C的情况下, &array[0] ,则使用1中的定义。这是第一个元素的地址,根据定义,当在表达式中使用时,它就是数组名称本身。 array &数组[0] 完全一样( 根据定义 )在表达式中找到时(不涉及 sizeof 操作员)。