2009-11-24 16 views
25

Si se escribe una función de C++ comoDiferencia entre [corchetes] y * asterisco

 
void readEmStar(int *arrayOfInt) 
{ 
} 

vs C++ función como:

 
void readEmSquare(int arrayOfInt[]) 
{ 
} 

¿Cuál es la diferencia entre el uso de [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) ; 
} 

Respuesta

56

Cuando se utiliza el tipo char x[] en lugar de char *xsin inicialización, se puede considerar a la misma. No puede declarar un nuevo tipo como char x[] sin inicialización, pero puede aceptarlos como parámetros para las funciones. En ese caso, son lo mismo que punteros.

Cuando se utiliza el tipo char x[] en lugar de char *xcon inicialización, son completamente 100% diferente.


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*)); 
} 

Codificación de estilo para pasar a las funciones:

Realmente doe 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.

Normalmente, esto ya está claro, ya que tendría otro parámetro para la longitud de la matriz.


Más información:

Por favor, vea este post titulado Arrays are not the same as pointers!

+0

Dado que las matrices y punteros son bastante similares en C++ quizás podría agregar un poco rápido sobre la diferencia (pila vs. montón, etc.) – tloach

+0

en readEmSquare, marcando sizeof (arrayOfInt) devolverá 4, es un puntero – bobobobo

+0

Vea mi nota sobre cuándo usa char [] sin inicialización. –

3

No hay ninguna diferencia entre los dos códigos, además de los diferentes estilos 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.

+4

Semánticamente lo mismo solo que los parámetros de función. –

+0

Una matriz no se pasa aquí por referencia (sí, en C++ también es posible pasar matrices por referencia). En cambio, la matriz, cuando se pasa a una función, se desintegra a un puntero al primer elemento, que se pasa por valor. Sin embargo, no hay diferencia entre los códigos. – UncleBens

-1

Las dos expresiones son equivalentes.Cada uno de ellos evalúa la dirección del primer elemento de la matriz arrayOfInt.

13

C++ estándar 13.1.3

- declaraciones de parámetros que difieren sólo en un puntero * frente a un array [] 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 posteriores dimensiones de matriz son significativas en los tipos de parámetro (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]); 

-fin ejemplo]

+0

¡Buen ejemplo! Me he estado preguntando sobre eso ... entonces el compilador descarta el número si lo especifica, básicamente, a menos que sea 2D o más, en cuyo caso, solo se guarda el último número. – bobobobo

1

Sobre la cuestión de estilo que me quedo 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.

Esto es solo mi opinión.

+0

Voy a sacar el cuello, y estoy de acuerdo :) –

+2

Chicos, sus cuellos están mostrando – bobobobo

Cuestiones relacionadas