programar - programacion c++ pdf
¿Qué significa " (2)
¿Cuál es su propósito, por qué fue agregado?
El propósito se ve cuando se usa una matriz de dos dimensiones de longitud variable como un parámetro de función. La función
int foo(int n, int m, int a[n][m]) {...}
puede ser prototipo como cualquiera de los siguientes
int foo(int , int, int [][*]);
int foo(int , int, int a[*][*]);
int foo(int , int, int (*a)[*]);
int foo(int n, int, int a[n][*]);
int foo(int , int m, int a[*][m]);
int foo(int , int m, int (*a)[m]);
int foo(int n, int m, int a[n][m]);
En el caso de una matriz bidimensional, cuando se usa como parámetro de función, no se puede omitir el tamaño de la segunda dimensión.
Si se omite el nombre de las primeras variables en el prototipo de la función, entonces no sería posible especificar la longitud (segunda dimensión) de la matriz.
El
*
da la pista de que la longitud de la matriz estará determinada por el segundo parámetro.
¿Cuál es la diferencia con
int[]
?
¿Cuál es la diferencia conint *
?
En el caso de la matriz 1D, para la definición de la función
int bar(int n, int a[n]} {...}
cualquiera de los siguientes prototipos es válido
int bar (int , int *);
int bar (int , int [*]);
Int bar (int , int []);
int bar (int n, int a[]);
int bar (int n, int a[n]);
int bar (int n, int [n]);
En este caso, ni
*
ni
n
son necesarios ya que el compilador tratará tanto
int [*]
como
int [n]
como
int *
.
Entonces, con una matriz unidimensional no se puede ver mucha diferencia.
NOTA: Cuando se usa una matriz de longitud variable como parámetro de función, el orden del parámetro es importante.
El orden de los parámetros para los primeros cuatro prototipos de
bar
se puede cambiar, pero en estos dos primeros parámetros no debe ser la matriz misma.
int bar (int a[n], int n); //Wrong. Compiler has not yet seen ''n''.
Esta pregunta ya tiene una respuesta aquí:
Al intentar implementar un analizador C11 (con fines educativos), descubrí que en C11 (p. 470) pero también en C99 (p. 412) (¡gracias Johannes!), El declarador directo se define como:
(6.7.6) direct-declarator:
direct-declarator [ type-qualifier-list? * ]
Al principio, pensé que esto era un error en la gramática (la lista de tipos no debería ser opcional). Sin embargo, cuando probé esto en mi compilador de referencia (clang), recibí un error bastante inesperado:
int array[*] = { 1, 2, 3 };
// error: star modifier used outside of function prototype
Aparentemente, (en clang) esto se llama modificador de estrella .
Aprendí rápidamente que solo pueden usarse en firmas de funciones:
void foobar(int array[*])
Sin embargo, solo pueden usarse en la declaración. Intentar usarlo en una definición de función también genera un error:
void foobar(int array[*]) {
// variable length array must be bound in function definition
}
Por lo que puedo decir, el comportamiento previsto es usar
[*]
en la declaración de la función y luego usar un número fijo en la definición de la función.
// public header
void foobar(int array[*]);
// private implementation
void foobar(int array[5]) {
}
Sin embargo, nunca lo he visto y tampoco entiendo el propósito.
- ¿Cuál es su propósito, por qué fue agregado?
-
¿Cuál es la diferencia con
int[]
? -
¿Cuál es la diferencia con
int *
?
El documento de justificación C para C99 dice
Un prototipo de función puede tener parámetros que tengan tipos de matriz de longitud variable (§6.7.5.2) utilizando una sintaxis especial como en
int minimum(int, int [*][*]);
Esto es coherente con otros prototipos C en los que no es necesario especificar el nombre del parámetro.
¿Cuál es la diferencia con int []
¿Cuál es la diferencia con int *.
Creo que es simplemente que esos tipos en un prototipo de función significa "puntero", mientras que un
[*]
en una posición no superior (
int[*]
todavía es igual a
int[]
Creo que, en un prototipo de función) en realidad es válido y
significa
formación
// not recommended though: it is now unclear what the parameters
// mean to human callers!
void f(int, int [][*]);
void f(int n, int x[][n]) {
x[1][0] = 1;
}
int main() {
int a[2][1];
f(1, a);
printf("%d/n", a[1][0]);
}
En cuanto al propósito, al indexar la matriz en la definición de la función, el compilador necesita saber cuántos enteros del siguiente índice se omitirá al dar el primer índice (
x[i]
omite
i * n
enteros en
f
arriba).
Pero esta información no es necesaria en la declaración de prototipo no definitoria, por lo tanto, puede omitirse y reemplazarse por
*
.