看到了一个形式怪异的函数

1
2
3
4
int (* backarry(int (* arrayname )[3])) [3]
{
    return arrayname;
}

查了一下"The C++ Programming Language",没有见到类似的类型。
为了研究其参数类型到底是什么,扩展了一下

1
2
3
4
5
6
7
8
9
10
int (* backarry(int (* arrayname )[3])) [3]
{
    cout<<sizeof(arrayname)<<endl;
    cout<<sizeof(arrayname[1])<<endl;
    for (int i=0;i<3;++i)
    {
        cout<<arrayname[i]<<endl;
    }
    return arrayname;
}

调用

1
2
int array[3]={1,2,3};
backarry(array);

CE,得知参数类型是某种指针。
改成

1
backarry(&array);

得到输出

4
12
0xbffce228
0xbffce234
0xbffce240

arrayname的大小是4,arrayname[0]是一个地址,看来参数类型是指针的指针。但为什么arrayname[1]的大小是12呢?
经过水牛指点,*arrayname,也就是arrayname[0],是这个三元数组的指针。arrayname[1]==*(arrayname+1),其地址没有任何意义。三元数组的大小是12,所以arrayname[0]的大小就是12,arrayname[1]、arrayname[2]的大小都是12。
综上所述,函数的参数类型和返回值类型都是一个三元数组的指针的指针。函数内可以使用(*arrayname)[i]来访问这个三元数组的第i+1个元素。