指向数组的真正指针(到目前为止还没有真正解决)并不常见,因为在大多数情况下,数组会衰减为指向其第一个元素的指针,并且根据定义,数组在内存中是连续的,这通常是所需要的。与其他指针类型相比,它们也有些不切实际,因为无法分配数组类型。它们在这方面类似于函数指针。
最大的实际区别在于它们保留了数组的大小,否则它会因指针衰减而丢失,例如函数调用和返回。以下面的代码为例
void function(char (*array)[10]) {
for(size_t i = 0; i < sizeof(*a); i++);
(*a)[i] = i;
}
...
char a[10];
function(&a);
除了允许 sizeof 的这种应用(这并不是非常有用,因为大小被称为参数的一部分),这将强制传递参数的确切大小作为类型的一部分function(char array[10])
,即使使用[static 10]
. 返回有一个不寻常的语法:
char (*function(void))[10] {
static char array[10];
// do something with our static array
return &array;
}
char (*a)[10] = function();
// or even
char (*b)[sizeof(*function())] = function();
我认为我从未在野外遇到过这种应用程序,但至少是可能的(并且是合法的)。