【问题标题】:Difference between [square brackets] and *asterisk[方括号]和*星号之间的区别
【发布时间】:2010-12-19 22:16:38
【问题描述】:

如果你写一个像这样的 C++ 函数

无效 readEmStar( int *arrayOfInt ) { }

vs C++ 函数,例如:

无效 readEmSquare(int arrayOfInt[]) { }

使用 [方括号] 与 *asterisk 有什么区别,是否有人有关于哪种风格指南更可取,假设它们等同于编译器?

为了完整起见,举个例子

void readEmStar( int *arrayOfInt, int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}


void readEmSquare( int arrayOfInt[], int len )
{
  for( int i = 0 ; i < len; i++ )
    printf( "%d ", arrayOfInt[i] ) ;
  puts("");
}

int main()
{
  int r[] = { 2, 5, 8, 0, 22, 5 } ;

  readEmStar( r, 6 ) ;
  readEmSquare( r, 6 ) ;
}

【问题讨论】:

    标签: c++ arrays function


    【解决方案1】:

    当您使用类型char x[] 而不是char *x 没有初始化,您可以认为它们相同。你不能在没有初始化的情况下将新类型声明为char x[],但你可以接受它们作为函数的参数。在这种情况下,它们与指针相同。

    当您使用char x[] 类型而不是char *x 进行初始化 时,它们完全不同。


    char x[]char *x 有何不同的示例:

    char sz[] = "hello";
    char *p = "hello";
    

    sz 实际上是一个数组,而不是一个指针。

    assert(sizeof(sz) == 6);
    assert(sizeof(sz) != sizeof(char*)); 
    assert(sizeof(p) == sizeof(char*));
    

    char x[]char *x 相同的示例:

    void test1(char *p)
    {
      assert(sizeof(p) == sizeof(char*));
    }
    
    void test2(char p[])
    {
      assert(sizeof(p) == sizeof(char*));
    }
    

    传递给函数的编码风格:

    你做哪一个真的不重要。有些人更喜欢char x[],因为很明显你想要传入一个数组,而不是单个元素的地址。

    通常这已经很清楚了,因为您将有另一个参数用于数组的长度。


    进一步阅读:

    请看这篇题为Arrays are not the same as pointers!的帖子

    【讨论】:

    • 由于数组和指针在 C++ 中非常相似,也许您可​​以快速补充一下区别(堆栈与堆等)
    • 在readEmSquare中,检查sizeof(arrayOfInt)会返回4,它是一个指针
    • 查看我的注释,了解何时使用 char[] 而不进行初始化。
    • :) - 就风格而言,它是否重要/哪个作为函数的参数?
    • @tloach:没有“堆栈与堆”的区别。指针不必指向堆。
    【解决方案2】:

    C++ 标准 13.1.3

    ——不同的参数声明 仅在指针 * 与数组 [] 中 是等价的。也就是数组 声明调整为 指针声明(8.3.5)。只有 第二个和后续数组维度 在参数类型中很重要 (8.3.4)。 [示例:

     int f(char*);
     int f(char[]);  // same as f(char*);
     int f(char[7]);  // same as f(char*);
     int f(char[9]);  // same as f(char*);
     int g(char(*)[10]);
     int g(char[5][10]);  // same as g(char(*)[10]);
     int g(char[7][10]);  // same as g(char(*)[10]);
     int g(char(*)[20]);  // different from g(char(*)[10]);
    

    ——结束示例]

    【讨论】:

    • 好例子!我一直想知道..所以如果你指定它,编译器会丢弃这个数字,基本上,除非它是 2D 或更多,在这种情况下,只保留最后一个数字。
    【解决方案3】:

    您的两个代码之间没有区别,除了明显不同的样式。在这两种情况下,数组都是通过引用而不是值传递的,因为函数参数type *xtype x[] 在语义上是相同的。

    【讨论】:

    • 此处不通过引用传递数组(是的,在 C++ 中也可以通过引用传递数组)。相反,数组在传递给函数时会衰减为指向第一个元素的指针,该元素是按值传递的。不过,代码之间没有区别。
    【解决方案4】:

    关于风格问题,我会伸出脖子说 int *arrayOfInt 更好。无论您使用哪种语法,您都在传递一个指针,并且类型应该清楚地表明这一点。

    这只是我的意见。

    【讨论】:

    • 我会伸出我的脖子,同意:)
    【解决方案5】:

    这两个表达式是等价的。它们各自计算为数组 arrayOfInt 的第一个元素的地址。

    【讨论】:

      猜你喜欢
      • 2016-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-22
      • 2022-11-19
      相关资源
      最近更新 更多