wheresbangtan usuario triángulo significado que pseint programa por pida pantalla número numeros muestre mismo ingresado imprimir imprima hacer filas donde convertir contraseña con como asteriscos aparezcan c arrays function function-parameter

usuario - ¿Por qué usar un asterisco "[*]" en lugar de un número entero para un parámetro de matriz VLA de una función?



que pida un número y muestre en pantalla el mismo número de asteriscos en java (2)

Cuando se usa matriz de longitud variable como parámetro en la función

int sum(int n, int a[n]);

es fácil de entender el primer parámetro ( n ) especifica la longitud del segundo parámetro ( a ). Pero se encontró con otro prototipo utilizado para VLAs como parámetro

int sum(int n, int a[*]);

es realmente difícil entender por qué * se usa en lugar de n dentro de [] ?


Cuando coloca la estrella en una función real, le da esta test.c:3: error: ''[*]'' not allowed in other than function prototype scope error. test.c:3: error: ''[*]'' not allowed in other than function prototype scope . Después de algunas investigaciones, esta es en realidad una forma de declarar un VLA en un prototipo de función, con * en lugar del nombre de la variable. VLA .
El problema aquí es que si coloca una variable en lugar de la estrella para un VLA, le dirá que no está declarada, por lo que la estrella es una forma en que c99 se incorporó para evitarlo.


La sintaxis [*] está destinada a utilizarse al declarar prototipos de función . El detalle clave aquí es que en los prototipos de función no es necesario que nombre sus parámetros, solo tiene que especificar el tipo de cada parámetro.

En su ejemplo, si deja el primer parámetro sin nombre , entonces obviamente no podrá usar n en su segunda declaración de parámetro (matriz). Sin embargo, en muchos casos debe decirle al compilador que algún parámetro es un VLA. Aquí es cuando la sintaxis [*] viene al rescate.

En su caso, si omite los nombres de los parámetros, el prototipo podría verse como

int sum(int, int [*]);

Sin embargo, es importante tener en cuenta que en su ejemplo específico, esta sintaxis es legal, pero no es exactamente necesaria. Al igual que con las matrices que no son VLA, un parámetro int [n] sigue siendo equivalente al parámetro int * (incluso para n no constantes). Esto significa que puedes simplemente prototipar tu función como

int sum(int, int []);

o como

int sum(int, int *);

y el prototipo aún cumplirá su propósito, es decir, coincidirá adecuadamente con la definición de la función. En otras palabras, las propiedades VLA de un parámetro declarado como una matriz 1D son completamente intrascendentes y la característica [*] no es realmente necesaria con dichas matrices VLA.

El [*] vuelve importante en situaciones en las que la "matriz variable" del tipo no se pierde, como sería el caso con VLA 2D (o un puntero a un VLA). Por ejemplo, una función definida como

int sum2d(int n, int m, int a[n][m]) { ... }

podría ser un prototipo como cualquiera de los siguientes

int sum2d(int, int, int a[*][*]); int sum2d(int n, int, int a[n][*]); int sum2d(int, int m, int a[*][m]); int sum2d(int n, int m, int a[n][m]);

Todos los prototipos anteriores coinciden adecuadamente con la definición de la función.

Por supuesto, si tiene el hábito de nombrar siempre todos los parámetros en prototipos de función, entonces nunca necesitará esta sintaxis [*] , ya que podrá usar el último prototipo en la lista anterior.

PS De nuevo, como es el caso con todas las matrices en declaraciones de parámetros, la primera [] siempre es inconsecuente y siempre decae a un puntero, lo que significa que las siguientes son también declaraciones válidas de prototipos equivalentes para la sum2d anterior2 sum2d

int sum2d(int, int, int a[][*]); int sum2d(int, int, int (*a)[*]); int sum2d(int n, int m, int (*a)[m]);

Es el segundo [] que realmente importa y debe declararse como "longitud variable".