传递给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 *
。 这些是不同的数据类型。