Sto*_*row 2 c c++ arrays pointers
我最近发现了指向固定数组的语法.在尝试使用它时,我惊讶地发现指针衰减似乎不起作用,如下例所示:
#include <iostream>
int main( int argc, char* argv[] )
{
char pa[3];
//char (*parr)[3] = &pa; // This works.
char (*parr)[3] = pa; // This doesn't work - why?
std::cout << (void*)pa << std::endl;
std::cout << (void*)parr << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
prog.cpp: In function 'int main(int, char**)':
prog.cpp:10:21: error: cannot convert 'char*' to 'char (*)[3]' in initialization
char (*parr)[3] = pa;
^
Run Code Online (Sandbox Code Playgroud)
使用gcc-4.9.2(Code Chef)进行编译.
有人可以帮助确定这里有什么问题吗?
更新:
这是一个有趣但更令人费解的发现:如果编译C风格,指针衰减按预期工作(我选择"C"作为Code Chef中的编译器,尽管它仍然显示gcc-4.9.2.也许有不同的编译器标志被传递以区分C和C++编译.)
上述代码的C版本:
#include <stdio.h>
int main( int argc, char* argv[] )
{
char pa[3];
/* char (*parr)[3] = &pa; */
char (*parr)[3] = pa;
printf( "0x%x\n", pa);
printf( "0x%x\n", parr);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译的C代码的输出:
0xbf92b1fd
0xbf92b1fd
Run Code Online (Sandbox Code Playgroud)
这个问题
char (*parr)[3] = pa;
Run Code Online (Sandbox Code Playgroud)
这parr是一个指向数组的指针,它与指向数组第一个元素的指针(这是数组名称可以衰减到的指针)不同.为了使它工作,你需要pa类似的地址
char (*parr)[3] = &pa;
Run Code Online (Sandbox Code Playgroud)