diferencia entre & array y & array cuando se pasa a una función C

¿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.