2009-04-08 17 views
7

Tengo algo de código que estoy manteniendo con la siguiente declaración de variables:matriz C como parámetro de la función char *

char tmpry[40]; 

Está siendo usado con esta función:

char *SomeFunction(char *tmpryP) { 
    // Do stuff. 
} 

La función llamada es:

SomeFunction(&tmpry[0]); 

estoy muy muy seguro de que eso es lo mismo que:

SomeFunction(tmpry); 

Incluso he comprobado que el puntero de caracteres * en SomeFunction termina apuntando a la misma ubicación de memoria que la matriz en ambos casos.

Mi pregunta es una comprobación de la cordura en cuanto a si las dos llamadas de función son idénticas (y, por lo tanto, el programador original estaba siendo desagradable)?

+0

Creo que sería bueno para pasar una longitud también a algunaFuncion, por si acaso ... :) –

+1

El nombre de la matriz de caracteres es un alias para la dirección del primer elemento de la matriz. – David

+0

Hola, soy uno de esos programadores "asquerosos" que escribe así. En general, hago esto en código C++, por la razón de menor acoplamiento a la abstracción de matriz utilizada en este momento. Es decir. para una estructura de datos * abstracta * en forma de matriz (como 'std :: vector ') con 'operador' [] expresiones sobrecargadas 'x' y' & x [0] 'significará cosas muy diferentes, y el * segundo * uno es el que se ajusta mejor para mi intención. Por supuesto, todo esto no importa tanto para la C simple, ya que casi no se obtiene abstracción de datos en C; por lo tanto, se debe preferir la ortografía con legibilidad superior. – ulidtko

Respuesta

12

son exactamente lo mismo.

someArray[i] 

significa exactamente

*(someArray + i) 

donde someArray en el segundo caso es un puntero a la posición de memoria. Del mismo modo,

&someArray[i] 

significa exactamente

(someArray + i) 

Tanto en estos casos, los términos son punteros a ubicaciones de memoria.

12

Los dos son equivalentes y creo SomeFunction (tmpry); es más legible

1

Ambos son uno y lo mismo, aunque el segundo se ve bien y aclara la intención de pasar la matriz a la función. Pero, ¿cómo sabe SomeFunction el tamaño de la matriz que se pasa, siempre se asume como 40? Siento que es mejor pasar el tamaño también como parámetro a SomeFunction.

+0

Acepto, debe pasar el tamaño y la matriz. –

+0

Mejor aún es usar std :: string, o boost/tr1 :: array. – GManNickG

+0

Acepto si es un código nuevo, pero si el código ya está escrito, puede que no sea posible cambiar las estructuras de datos tan fácilmente ... – Naveen

1

Estas dos variantes son equivalentes y que pasa como esto

SomeFunction(tmpry); 

se ve más limpio.

7

Se puede ser significativa, si SomeFunction es una macro y toma "sizeof" de uno de sus argumentos, porque sizeof(tmpry) puede no ser necesariamente igual a sizeof(&tmpry[0]).

De lo contrario, como otros señalaron, son exactamente lo mismo.

+0

En este caso no hay ninguna macro involucrada. Sin embargo, ¿cómo podría una macro tratarlos de manera diferente? ¿No funciona una macro como una búsqueda de cadenas y reemplazar por lo que la función que produjo sería equivalente a una función normal de todos modos? – sipwiz

+0

Los resultados serán diferentes si la macro toma sizeof (argumento de macro). –

+0

#define Macro (x) RealFunctionCall (x, sizeof (x)) // Por ejemplo – dreamlax

3

Como todos los demás dijeron, las dos anotaciones son equivalentes.

Yo normalmente uso el más simple, a menos que haya varias llamadas de este tipo:

SomeFunction(&tmparry[0]); 
SomeFunction(&tmparry[10]); 
SomeFunction(&tmparry[NNN]); 

Dónde idealmente todas las constantes (números mágicos) serían de enumeración (o #define) constantes.

+0

bueno, incluso entonces, tmparry + 10 es mejor que & tmparray [10] – hasen

+1

No estoy de acuerdo, pero es una decisión subjetiva. –

1

La declaración

int a [10]; int * pa;

Hay una diferencia entre una matriz y un puntero que debe tenerse en cuenta. Un puntero es una variable, por lo que pa = a y pa ++ son legales. Pero un nombre de matriz no es una variable; construcción como a = pa y un ++ son ilegales

Como parámetros de formato en una definición de función, Char s [] y char * s son equivalentes;

Desde: The C Programming Language 2th., Página 99-100

+0

Para citar de la página 99: "Cuando se pasa un nombre de matriz a una función, lo que se pasa es la ubicación del elemento inicial" – David

Cuestiones relacionadas