2012-09-24 43 views
5

¿Las 2 funciones siguientes son esencialmente la misma función?Es un parámetro int * exactamente igual que un parámetro int []

es decir, ¿es int* exactamente lo mismo que int[]?

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

¿Cómo puedo utilizar la primera función? Es decir, ¿cómo puedo pasar matrices en los parámetros? ¿Lo siguiente es válido/correcto?

int xVals[5], yVals[5], zVals[5]; 
myFunction(xVals, yVals, zVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], &zVals[0], 5); 
+4

¿Estás seguro de que no significabas 'int xVals []'? – cnicutar

+0

@cnicutar sí, sry debería ser que –

+0

No hay problema, ahora puedo referirme a [Pero escuché que char 'a []' era idéntico a char '* a'] (http://c-faq.com/ aryptr/aryptr2.html) – cnicutar

Respuesta

8

En una lista de parámetro de función, a continuación, las declaraciones de función son equivalentes:

int myFunction(int* xVals, int* yVals, int nVertices); 
int myFunction(int xVals[], int yVals[], int nVertices); 

Sin embargo, esto no se generaliza fácilmente. Dentro de una función, hay una gran diferencia entre:

int AnotherFunction(void) 
{ 
    int array[] = { 0, 1, 2, 3 }; 
    int *iptr = &array[0]; 
    ... 
} 

Y en un interfaz de la función, hay una gran diferencia entre los tipos de dos parámetros:

int arrays_vs_pointers(int **iptrptr, int array[][12]); 

También preguntar acerca de (corregido):

int xVals[5], yVals[5]; 
myFunction(xVals, yVals, 5); 

// or should it be.. 
myFunction(&xVals[0], &yVals[0], 5); 

Estas llamadas son válidos y son equivalentes entre sí.


La respuesta a la pregunta del título original "es una int * exactamente lo mismo que un int []? 'es No.

Hay un número muy limitado de circunstancias en las que son equivalentes, pero hay muchas más circunstancias en las que son muy diferentes.

La respuesta a su pregunta principal revisada '¿Es un parámetro int * exactamente el mismo que un parámetro int []? 'es ¡Sí!

2

La pregunta del título es diferente de la cuestión en el cuerpo de la entrada real ...

En general, es no es cierto que los punteros son las mismas que las matrices, por lo que en en muchos casos, int [] no es lo mismo que int *.

Sin embargo, en una declaración función (o definición), cuando una matriz de una dimensión se pasa como el argumento, se desintegra en un puntero, por eso, en contraste con el primer caso,

int myFunction(int *xVals, int *yVals, int nVertices); 

y

int myFunction(int xVals[], int yVals[], int nVertices); 

son equivalentes.

1

Las respuestas anteriores son correctas. Esto es sólo para añadir que tiene un recuento de parámetros no coincidentes entre su declaración y su llamada:

int myFunction(int* xVals, int* yVals, int nVertices); 

myFunction(xVals, yVals, zVals, 5); 

myFunction está a la espera de 3 parámetros, pero estás pasando 4 en su llamada.

0

Algunos interesantes (? Útiles) puntos alrededor de dichas especificaciones de los parámetros:

  • si especifica una dimensión para un parámetro de matriz de 1 dimensión, no se registró ninguna manera en contra del argumento de llamadas proporcionados, por ejemplo: f(int x[5]) se puede llamar ala int x[] = { 1, 2}; f(x); o incluso int x; f(&x);

  • si acepta una referencia a un parámetro, entonces las dimensiones son comprobado y debe coincidir, por ejemplo: f(int (&x)[5]) sólo se puede llamada con un argumento que es una matriz de enteros con exactamente 5 elementos (o algo emitidos para ese tipo)

  • plantillas se pueden utilizar para capturar las dimensiones del compilador conocido de parámetros, como en: template <size_t N> void f(int (&x)[N]) { ...can use N in here... }

  • para estos últimos dos parámetros por referencia, no se puede pasar en cualquier edad puntero-a-int ... si el puntero realmente es un conjunto adecuado hay que convertir primero

  • que los parámetros de referencia se comprueban en tiempo de compilación -time sugiere que deben preferirse cuando se conoce el número de argumentos en tiempo de compilación ... en la práctica puede ser un smidge más complicado que eso, por ejemplo una biblioteca que proporciona un encabezado declarando void f(int[]); podría variar la implementación y enviar un nuevo objeto de biblioteca que soporte el procesamiento de una matriz de diferente tamaño (que necesitaría detectar en función de algún otro argumento o centinela) convension) sin un cambio de encabezado que requiera o desencadene la recompilación del cliente (en la mayoría de los sistemas de compilación)

Cuestiones relacionadas