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

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)

Nat*_*ica 7

这个问题

char (*parr)[3] = pa;
Run Code Online (Sandbox Code Playgroud)

parr是一个指向数组的指针,它与指向数组第一个元素的指针(这是数组名称可以衰减到的指针)不同.为了使它工作,你需要pa类似的地址

char (*parr)[3] = &pa;
Run Code Online (Sandbox Code Playgroud)

  • 在这种情况下,`&pa [0]`是指向第一个元素的`char*`.`&pa`是指向数组的`char(*)[3]`.它们具有相同的值但具有不同的类型. (4认同)
  • @StoneThrow`&pa`和`&pa [0]`是相同的地址,但类型不同 - 一个指向数组,一个指向该数组的元素.这类似于获取struct/class的地址vs获取该struct/class的第一个数据成员的地址. (3认同)
  • @StoneThrow由于编译器扩展,它适用于您.只有在存在"-pedantic-errors"时,GCC才会拒绝它. (2认同)