问题描述
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,... };