在指向指针到固定数组的过程中没有指针衰减

时间:2017-05-25 18:38:15

标签: 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;
}

输出:

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

1 个答案:

答案 0 :(得分:7)

的问题
char (*parr)[3] = pa;

parr是指向数组的指针,它与指向数组第一个元素的指针(数组名称可以衰减到的指针)不同。为了使其正常工作,您需要pa的地址

char (*parr)[3] = &pa;