2012-07-01 3 views
7

leí una pregunta anterior que fue cerrada debido a ser un duplicado exacto de esta¿Por qué el argumento decaimiento a puntero para matriz parece no aplicarse a sizeof()?

When a function has a specific-size array parameter, why is it replaced with a pointer?

y

How to find the 'sizeof' (a pointer pointing to an array)?

pero después de leer este Todavía estoy confundido por la forma en sizeof() trabajos. Yo entiendo que la aprobación de una matriz como un argumento a una función como

void foo(int a[5]) 

se traducirá en el argumento de matriz en descomposición de un puntero. Lo que no encontré en los enlaces de 2 preguntas anteriores fue una respuesta clara de por qué la función sizeof() está exenta (o al menos aparentemente exenta de) este comportamiento de disminución de puntero. Si sizeof() se comportaron como cualquier otra función a continuación,

int a[5] = {1,2,3,4,5}; 
    cout << sizeof(a) << endl; 

, lo anteriormente expuesto debe ser la salida 4 en lugar de 20. ¿Me he olvidado de algo obvio, ya que parece ser una contradicción entre el deterioro y el comportamiento del puntero? Perdón por traer esto de nuevo, pero realmente estoy teniendo dificultades para entender por qué sucede esto a pesar de haber utilizado felizmente la función durante años sin realmente pensar en ello.

+3

Nota: 'void foo (int (y a) [5])' will * not * hará que el argumento del array decaiga. Es el objetivo lo que es importante, no la fuente. – Xeo

+3

'void foo (int a [5])' - Realmente me gustaría que la forma del parámetro se desaprobara y solo se permita el formulario 'void foo (int * a)', no causa más que confusión. No me importa quién es el código que rompe. –

Respuesta

15

Debido a que la norma dice así (el énfasis es mío):

(C99, 6.3.2.1p3) "Excepto cuando es el operando del operador sizeof o el unario operador &, o es una cadena literal utilizada para inicializar una matriz, una expresión que tiene tipo "matriz de tipo" se convierte en una expresión con el tipo "puntero a tipo" que apunta al elemento inicial del objeto matriz y no es un valor l ".

Tenga en cuenta que para C++, la norma dice explícitamente el tamaño es el tamaño de la matriz:

(C++ 11, 5.3.3p2 sizeof) "[...] cuando se aplica a una matriz, el resultado es el número total de bytes en la matriz. Esto implica que el tamaño de una matriz de n elementos es n veces el tamaño de un elemento. "

+0

Gracias, esto lo aclara perfectamente. – mathematician1975

+0

En C++, la regla es ligeramente diferente, tiene otro caso en el que no se produce la disminución: al vincular una expresión de matriz a una referencia de matriz. Pero esas son cosas raras. Ver también http: // stackoverflow.com/questions/3368883/how-does-this-size-of-array-template-function-work – MSalters

6

sizeof es un operador, no una función. Es específico en eso, también. Los paréntesis no son necesarios, incluso si se trata de una expresión:

int a; 
sizeof (int); //needed because `int` is a type 
sizeof a; //optional because `a` is an expression 
sizeof (a); //^ also works 

Como se puede ver, es en este gráfico de precedence también. También es uno de los operadores no cargables.

Cuestiones relacionadas