Quando uma function tem um parâmetro de matriz de tamanho específico, por que ela é substituída por um ponteiro?

Dado o seguinte programa,

#include  using namespace std; void foo( char a[100] ) { cout << "foo() " << sizeof( a ) << endl; } int main() { char bar[100] = { 0 }; cout << "main() " << sizeof( bar ) << endl; foo( bar ); return 0; } 

saídas

 main() 100 foo() 4 
  1. Por que a matriz é passada como um ponteiro para o primeiro elemento?
  2. É uma inheritance de C?
  3. O que diz o padrão?
  4. Por que o tipo estrito de segurança do C ++ caiu?

    Sim, é herdado de C. A function:

     void foo ( char a[100] ); 

    Terá o parâmetro ajustado para ser um ponteiro e assim se torna:

     void foo ( char * a ); 

    Se você quiser que o tipo de array seja preservado, você deve passar uma referência para o array:

     void foo ( char (&a)[100] ); 

    C ++ ’03 8.3.5 / 3:

    … O tipo de uma function é determinado usando as seguintes regras. O tipo de cada parâmetro é determinado a partir de seu próprio decl-specifier-seq e declarator. Depois de determinar o tipo de cada parâmetro, qualquer parâmetro do tipo “matriz de T” ou “function retornando T” é ajustado para ser “ponteiro para T” ou “ponteiro para function retornando T”, respectivamente ….

    Para explicar a syntax:

    Verifique a regra “direita-esquerda” no google; Eu encontrei uma descrição aqui .

    Seria aplicado a este exemplo aproximadamente da seguinte forma:

     void foo (char (&a)[100]); 

    Comece pelo identificador ‘a’

    ‘a’ é um

    Mova-se para a direita – encontramos a ) então, invertemos a direção procurando o ( . À medida que nos movemos para a esquerda, passamos

    ‘a’ é uma referência

    Depois que a gente alcança a abertura ( então nós invertemos novamente e olhamos bem. Agora vemos [100]

    ‘a’ é uma referência a uma matriz de 100

    E nós invertemos a direção novamente até chegarmos a char :

    ‘a’ é uma referência a uma matriz de 100 caracteres

    Sim. Em C e C ++ você não pode passar matrizes para funções. É assim que é.

    Por que você está fazendo matrizes simples de qualquer maneira? Você já olhou para boost / std::tr1::array / std::array ou std::vector ?

    Observe que você pode, no entanto, passar uma referência a uma matriz de comprimento arbitrário para um modelo de function. Em cima da minha cabeça:

     template< std::size_t N > void f(char (&arr)[N]) { std::cout << sizeof(arr) << '\n'; } 

    Há uma palavra magnífica na terminologia C / C ++ que é usada para matrizes estáticas e pointers de function – decaimento . Considere o seguinte código:

     int intArray[] = {1, 3, 5, 7, 11}; // static array of 5 ints //... void f(int a[]) { // ... } // ... f(intArray); // only pointer to the first array element is passed int length = sizeof intArray/sizeof(int); // calculate intArray elements quantity (equals 5) int ptrToIntSize = sizeof(*intArray); // calculate int * size on your system