sintaxis programar programacion libro lenguaje ejemplos dev como comandos basicos c function parameters variable-length-array

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 con int * ?

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''.

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.

  1. ¿Cuál es su propósito, por qué fue agregado?
  2. ¿Cuál es la diferencia con int[] ?
  3. ¿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 * .