微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

指向数组的C指针/指针数组的歧义消除扩展

如何解决指向数组的C指针/指针数组的歧义消除扩展

There is a post where different pointer notations are explained:

int* arr1[8]; // An array of int pointers.
int (*arr2)[8]; // A pointer to an array of integers
int *(arr3[8]); // The same as the first one

但是也可以定义以下内容

int (*arr4[8])

在这里,除数据类型名称外的所有内容都用括号括起来。它与三个选项有什么不同?

我也尝试像(int *arr4[8])一样将其括起来,但似乎在C语言中无效。

我也对这样的构造感到好奇:

int (*arr5[8])[8]

不确定,但是我认为这类似于指向整数数组的指针数组。 如果我需要指定一个指向这种构造的指针,我认为这是这样的:

int (*(*arr5[8]))[8]

如果我把最外面的括号放在一边,我想这就像指向整数的指针数组的指针数组,是吗?

int *(*arr5[8])[8]

这一切正确吗?预先感谢!

解决方法

您可以将声明符括在括号中。

此声明

int (*arr4[8]);

声明由int *类型的8个元素组成的数组。和写一样

int * arr4[8];

此声明

int (*(*arr5[8]))[8];

然后为了清楚起见,请考虑以下演示程序。

#include <stdio.h>

int main(void) 
{
    int a1[8] = { [0] = 10 };
    int a2[8] = { [0] = 20 };
    
    int ( *p1 )[8] = &a1;
    int ( *p2 )[8] = &a2;
    
    int (*(*arr5[8]))[8] =
    {
        &p1,&p2
    };
    
    printf( "%d\n",( **arr5[0] )[0] );
    printf( "%d\n",( **arr5[1] )[0] );
    
    return 0;
}

程序输出为

10
20

这是声明

int (*(*arr5[8]))[8]

声明一个指针数组,该指针数组指向类型为int[8]的数组。

,

int (*arr4[8])

在这里,除数据类型名称外的所有内容都用括号括起来。它与三个选项有什么不同?

括号是唯一重要的时刻,它们何时更改了运算符的默认优先级。在声明符和表达式中,后缀[]()的优先级均高于一元*,因此*arr4[8]被解析为*(arr4[8])(*arr4[8])不会影响*[]的优先级,因此与编写*(arr4[8])*arr4[8]相同。但是,使用(*arr3)[8],它们 do 更改了优先级,将*运算符与arr明确分组。

我也尝试像(int *arr4[8])一样将其括起来,但似乎在C语言中无效。

不是-语法不允许。

int (*arr5[8])[8]

不确定,但是我想这就像是一个指向整数数组的指针数组。

确切地说,arr5是指向int的8元素数组的指针的8元素数组。在图形上,它看起来像这样:

      +---+                     +---+---+---+---+---+---+---+---+     
arr5: |   | arr5[0] ----------> |   |   |   |   |   |   |   |   |
      +---+                     +---+---+---+---+---+---+---+---+
      |   | arr5[1] --------+
      +---+                 |   +---+---+---+---+---+---+---+---+
      |   | arr5[2] ------+ +-> |   |   |   |   |   |   |   |   |
      +---+               |     +---+---+---+---+---+---+---+---+
       ...                |     
                          |     +---+---+---+---+---+---+---+---+
                          +---> |   |   |   |   |   |   |   |   |
                                +---+---+---+---+---+---+---+---+

您会将每个元素索引为(*arr5[i])[j]-您不想索引到每个arr5[i],而是想索引每个arr5[i] 指向的内容。声明器预先告诉您-您不必自己搞定。声明符的结构反映了表达式的结构。

请注意,此声明不会创建int的8元素数组-它仅 创建一个8元素的指针数组。您可能需要为每个指向的arr5[i]动态分配内存,例如:

for ( size_t i = 0; i < 8; i++ )
  arr5[i] = malloc( sizeof *arr5[i] ); // sizeof *arr5[i] == sizeof (int [8])

或已经声明了一堆数组:

int foo[8];
int bar[8];
int bletch[8];
...
int (*arr5[8])[8] = { &foo,&bar,&bletch,... };

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。