¿Hay alguna diferencia entre & array [0] y & array cuando se pasa a una función C. Esta matriz es una matriz nula * que actualmente toma un entero como datos.
Añadido el código de prueba
#include #include using namespace std; int read_buffer[10] = {0,0,0,0,0,0,0,0,0,0}; int write_buffer[10] = {0,1,2,3,4,5,6,7,8,9}; void WriteBlock(void* SrcPtr) { //WriteBlock will use SrcPtr and store the data to a common memory block which ReadBlock will access. } void ReadBlock(void* DstPtr) { //ReadBlock function will fetch data from readBuffer and put the data back into the *DstPtr. } void main() { WriteBlock((int*)&write_buffer); //Is there a difference between these two below calls. ReadBlock(&read_buffer[0]); ReadBlock(&read_buffer); }
Sí, hay una gran diferencia, y depende del contexto.
Considera esto:-
char arrayA[10]; char *arrayB;
&arrayA[0]
y &arrayB[0]
tienen el tipo char *
.
Pero &arrayA
tiene el tipo char (*)[10]
mientras que &arrayB
tiene el tipo char **
– la dirección del puntero.
Para arrayA
, estos apuntan a la misma dirección, pero para arrayB
, ¡no lo hacen! Hay un error común en C que dice que “los punteros y las matrices son iguales”. Este es un gran ejemplo de dónde no son absolutos,
Vea esto: http://ideone.com/OcbuXZ
Suponiendo que la array
está declarada
void *array[N];
entonces las expresiones &array[0]
y &array
producirán el mismo valor (la dirección del primer elemento de la matriz es la misma que la dirección de la matriz en sí misma), pero tendrá diferentes tipos .
Expression Type ---------- ---- &array void *(*)[10] -- pointer to 10-element array of `void *` &array[0] void ** -- pointer to pointer to void
El prototipo de su función deberá coincidir con la expresión que pase. Si llamas a la función como
func(&array);
entonces la función prototipo debe ser
void func(void *(*arrp)[10]) {...}
Si llamas a la función como
func(&array[0]);
entonces la función prototipo debe ser
void func(void **arrp) {...}
aunque en ese caso debe pasar el tamaño de la matriz como un parámetro separado.
Ahora, asumiendo que la array
está declarada
void **array = malloc(sizeof *array * N);
entonces las expresiones &array
y &array[0]
generarán diferentes valores y diferentes tipos.
Expression Type ---------- ---- &array void *** &array[0] void **
&array
le dará la dirección de la variable de array
, que es diferente de la dirección de la memoria de stack que se ha asignado para la matriz. Nuevamente, su prototipo de función deberá coincidir con el tipo de expresión que usa.
Si la array
es realmente una matriz, entonces
&array[0]
es el puntero al elemento 0 de array[]
&array
es el puntero a toda la array[]
Por lo tanto, estas dos expresiones son de diferentes tipos. Y esa es la principal diferencia que puede hacer que su código no se compile si pasa uno incorrecto de los dos.
En el nivel bajo, sin embargo, los dos punteros mantendrán la misma dirección.
Si hay una gran diferencia
&array[0]==>void**
Y
&array==>void***
Esto no se comstackrá, estás usando un void *
e intentas obtener el primer elemento. Pero, ¿qué tamaño tiene? El comstackdor no sabe. Usar int *
puede comstackr, si no está intentando algo como esto:
int main (void) { int *arr = malloc( 10 ); arr = &arr[0]; // this is ok arr = &arr; // wrong data type }
&array
devuelve un int **
, &array[0]
devuelve int *
. Estos son diferentes tipos de datos.