oí una matriz es equivalente a un puntero constante y no se puede aumentar, ya que no es un valor-i ...
Casi.
Una matriz expresión es una lvalue no modificable; puede no ser un operando para operadores como ++
o --
, y puede no ser el destino de una expresión de asignación. Esto no es lo mismo que un puntero constante (es decir, un puntero declarado como T * const
).
Una expresión de matriz será reemplazado con una expresión puntero cuyo valor es la dirección del primer elemento de la matriz excepto cuando la expresión de matriz es un operando de los sizeof
o unario &
operadores, o cuando la expresión de matriz es un literal de cadena que se usa para inicializar otra matriz en una declaración.
Cuando se llama a una función con un argumento de matriz, tales como
int a[N];
...
foo(a);
la expresión a
se convierte de "array N-elemento de int
" tipo a "puntero a int
", y este valor del puntero es lo que pasa a foo
; Por lo tanto, el prototipo de función correspondiente debe ser
void foo (int *arr) {...}
Tenga en cuenta que en el contexto de una declaración parámetro de función, T a[]
y T a[N]
son idénticos a T *a
; en los tres casos, a
se declara como un puntero a T
.Dentro de la función foo
, el parámetro arr
es una expresión de puntero, que es un valor l modificable, y como tal puede asignarse ay puede ser el operando de los operadores ++
y --
.
Recuerde que todas estas conversiones se encuentran en la matriz expresión; es decir, el identificador de matriz u otra expresión que hace referencia a la matriz objeto en la memoria. El objeto de matriz (el fragmento de memoria que contiene los valores de matriz) no se convierte.
Lea la sección 6 de las [preguntas frecuentes comp.lang.c] (http://c-faq.com). –