我最近发现了指向固定数组的指针的语法。在尝试使用它时,我惊讶地发现指针衰减似乎没有像下面的例子那样起作用:
#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;
}
输出:
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;
^
使用gcc-4.9.2(Code Chef)进行编译。
有人可以帮助确定这里有什么问题吗?
更新:
这是一个有趣但更令人费解的发现:如果编译C风格,指针衰减按预期工作(我选择&#34; C&#34;作为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;
}
已编译的C代码的输出:
0xbf92b1fd
0xbf92b1fd
答案 0 :(得分:7)
的问题
char (*parr)[3] = pa;
是parr
是指向数组的指针,它与指向数组第一个元素的指针(数组名称可以衰减到的指针)不同。为了使其正常工作,您需要pa
的地址
char (*parr)[3] = &pa;