研究了一个形式怪异的函数
看到了一个形式怪异的函数
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个元素。
