【发布时间】:2017-05-25 18:38:15
【问题描述】:
我最近发现了指向固定数组的指针的语法。在尝试它时,我惊讶地发现指针衰减似乎不像下面的例子那样起作用:
#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 样式(我在 Code Chef 中选择“C”作为编译器,尽管它仍然显示 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
【问题讨论】:
-
现代 C++ 有
std::array和std::vector时,为什么还要使用旧式 C 数组? -
如果您使用的是 c++,请考虑改用
std::array。