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

括号在指针数组声明过程中有作用吗?

  •  2
  • Abenaki  · 技术社区  · 2 周前

    最近,我在阅读Brain和Dennis的《C编程语言》教材时发现,指针数组的定义如下所示:

    int (*a)[10];
    
    int *a [10];
    

    ( https://i.sstatic.net/82lnWvfT.png )

    在课本上是这样写的:

    From The C programming language text book

    我不太明白其中的区别。如果

     int (*a)[10];
    

    定义了一个指向10个整数数组的指针,“*”的用途是什么。之间的区别是什么

     int (*a)[10];
    
     int a [10];
    

    ( https://i.sstatic.net/kE2ruHVb.png )

    2 回复  |  直到 2 周前
        1
  •  2
  •   Vlad from Moscow    2 周前

    在本声明中

    int a [10];
    

    声明了一个由10个类型的对象组成的数组 int .

    您可以通过以下方式检查阵列的大小

    printf( "sizeof( a ) = %zu\n", sizeof( a ) );
    

    如果 sizeof( int ) 等于 4 那么上面的调用 printf 将输出 40 :整个阵列的大小。

    在本声明中

    int (*a)[10];
    

    声明了一个指向的数组的指针 10 元素。

    它用于重命名标识符 a p 然后您可以在考虑数组声明的情况下进行编写 在上面

    int a [10];
    int ( *p )[10] = &a;
    

    指针的大小 p 等于任一 4. 8 取决于所使用的系统。您可以使用以下调用进行检查 输出函数 :

    printf( "sizeof( p ) = %zu\n", sizeof( p ) ):
    

    取消引用指针可以将数组作为指针指向的单个对象 p 。所以如果你愿意写

    printf( "sizeof( *p ) = %zu\n", sizeof( *p ) );
    

    你会得到数组的大小 .

    关于本声明

    int *a [10];
    

    然后它声明一个数组元素,该数组元素具有指针类型 int * 。将这行重写为

    int * a [10];
    

    实际上,这个声明相当于

    int * ( a [10] );
    

    再次,您可以使用的呼叫 输出函数 喜欢

    printf(“sizeof(a)=%zu\n”,sizeof(b));
    

    输出将等于 40 80 取决于 sizeof( int * ) 等于 4. 8. .

    若要声明指向此数组的指针,可以编写

    int * a [10];
    int * ( *p )[10] = &a;
    
        2
  •  1
  •   SteelFeather    2 周前

    这就是我对它的解释,使它变得简单——左右规则(递归)。所以对于第一种情况

    int (*a)[10];
    

    a-由于括号闭合,右边没有任何内容。现在左边说是一个指针。到目前为止(*a)表示a是一个指针。现在再次转到右边,这样一个数组[10],然后是类型int的左边。所以要完成它,a是指向int[10]数组的指针。

    int *b [10];
    

    b-到右边a是一个大小为10的数组,然后是int指针的左边。所以b是一个大小为10的int*数组。

    您可以通过检查&b

    在我的机器上:

     size of a:8
     size of b:80