传递给C函数时&array 和&array之间的区别

传递给C函数时,&array [0]和&array之间是否存在差异? 此数组是一个void *数组,当前将整数作为数据。

添加了测试代码

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

是的,这有很大的不同,这取决于背景。

考虑一下: –

 char arrayA[10]; char *arrayB; 

&arrayA[0]&arrayB[0]都有char *类型。

但是&arrayA类型为char (*)[10]&arrayB类型为char ** – 指针的地址。

对于arrayA ,这些指向相同的地址 – 但对于arrayB它们不会! 有一个常见的C误认为“指针和数组是相同的”。 这是一个很好的例子,他们不是绝对的,

见: http : //ideone.com/OcbuXZ

假设声明了array

 void *array[N]; 

那么表达式&array[0]&array将产生相同的 (数组的第一个元素的地址与数组本身的地址相同),但是会有不同的类型

 Expression Type ---------- ---- &array void *(*)[10] -- pointer to 10-element array of `void *` &array[0] void ** -- pointer to pointer to void 

你的函数原型需要与你传递的任何表达式相匹配。 如果您将该function称为

 func(&array); 

然后function原型需要

 void func(void *(*arrp)[10]) {...} 

如果您将该function称为

 func(&array[0]); 

然后function原型需要

 void func(void **arrp) {...} 

虽然在这种情况下,您应该将数组的大小作为单独的参数传递。

现在,假设声明了array

 void **array = malloc(sizeof *array * N); 

那么表达式&array&array[0]将产生不同的值不同的类型。

 Expression Type ---------- ---- &array void *** &array[0] void ** 

&array将为您提供array变量本身的地址,这与为数组分配的堆内存的地址不同。 同样,您的函数原型需要与您使用的表达式类型相匹配。

如果array实际上是一个数组,那么

  • &array[0]是指向array[]元素0的指针
  • &array是指向整个array[]的指针

所以,这两个表达式是不同的类型。 这是主要区别,如果你传递错误的一个,可能会导致代码无法编译。

然而,在低级别,两个指针将保持相同的地址。

是的,有一个很大的不同

 &array[0]==>void** 

 &array==>void*** 

这不会编译,你使用void *并尝试获取它的第一个元素。 但它有多大的尺寸? 编译器不知道。 如果你没有尝试这样的东西,使用int *可以编译:

 int main (void) { int *arr = malloc( 10 ); arr = &arr[0]; // this is ok arr = &arr; // wrong data type } 

&array返回一个int **&array[0]返回int * 。 这些是不同的数据类型。