c++ - signo - para que sirven los corchetes en programacion
Diferencia entre[corchetes] y*asterisco (5)
Si escribe una función de C ++ como
void readEmStar( int *arrayOfInt ) { }
vs una función C ++ como:
void readEmSquare( int arrayOfInt[] ) { }
¿Cuál es la diferencia entre usar [corchetes] vs * asterisco, y alguien tiene una guía de estilo sobre cuál es preferible, suponiendo que son equivalentes al compilador?
Para completar, un ejemplo
void readEmStar( int *arrayOfInt, int len )
{
for( int i = 0 ; i < len; i++ )
printf( "%d ", arrayOfInt[i] ) ;
puts("");
}
void readEmSquare( int arrayOfInt[], int len )
{
for( int i = 0 ; i < len; i++ )
printf( "%d ", arrayOfInt[i] ) ;
puts("");
}
int main()
{
int r[] = { 2, 5, 8, 0, 22, 5 } ;
readEmStar( r, 6 ) ;
readEmSquare( r, 6 ) ;
}
Cuando utiliza el tipo char x[]
lugar de char *x
sin inicialización , puede considerarlos igual. No puede declarar un nuevo tipo como char x[]
sin inicialización, pero puede aceptarlos como parámetros de las funciones. En ese caso, son lo mismo que punteros.
Cuando utiliza el tipo char x[]
lugar de char *x
con la inicialización , son completamente 100% diferentes.
Ejemplo de cómo char x[]
es diferente de char *x
:
char sz[] = "hello";
char *p = "hello";
sz
es en realidad una matriz, no un puntero.
assert(sizeof(sz) == 6);
assert(sizeof(sz) != sizeof(char*));
assert(sizeof(p) == sizeof(char*));
Ejemplo de cómo char x[]
es lo mismo que char *x
:
void test1(char *p)
{
assert(sizeof(p) == sizeof(char*));
}
void test2(char p[])
{
assert(sizeof(p) == sizeof(char*));
}
Estilo de codificación para pasar a funciones:
Realmente no importa cuál hagas. Algunas personas prefieren char x[]
porque está claro que desea que se transfiera una matriz y no la dirección de un solo elemento.
Usualmente esto ya está claro porque tendrías otro parámetro para la longitud de la matriz.
Otras lecturas:
Por favor, mira esta publicación titulada Arrays no son lo mismo que punteros!
En la pregunta de estilo, voy a sacar mi cuello y decir int * arrayOfInt es mejor. Cualquiera que sea la sintaxis que use, está pasando un puntero y el tipo debería dejarlo en claro.
Esta es sólo mi opinión.
Estándar C ++ 13.1.3
- Las declaraciones de parámetros que difieren solo en un puntero * frente a una matriz [] son ​​equivalentes. Es decir, la declaración de matriz se ajusta para convertirse en una declaración de puntero (8.3.5). Solo la segunda y subsiguientes dimensiones de la matriz son significativas en los tipos de parámetros (8.3.4). [Ejemplo:
int f(char*);
int f(char[]); // same as f(char*);
int f(char[7]); // same as f(char*);
int f(char[9]); // same as f(char*);
int g(char(*)[10]);
int g(char[5][10]); // same as g(char(*)[10]);
int g(char[7][10]); // same as g(char(*)[10]);
int g(char(*)[20]); // different from g(char(*)[10]);
-Final ejemplo]
Las dos expresiones son equivalentes. Cada uno de ellos evalúa la dirección del primer elemento de la matriz arrayOfInt.
No hay diferencia entre tus dos códigos, aparte del estilo diferente obviamente. En ambos casos, la matriz se pasa por referencia y no por valor, ya que los parámetros de función type *x
y type x[]
son semánticamente iguales.