传递给C函数时,& array [0]和&数组之间是否存在差异?这个数组是一个void *数组,它当前以整数作为数据。
添加了测试代码
#include <iostream>
#include <conio.h>
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);
}
答案 0 :(得分:6)
是的,这有很大的不同,这取决于背景。
考虑一下: -
char arrayA[10];
char *arrayB;
&arrayA[0]
和&arrayB[0]
都有char *
类型。
但&arrayA
的类型为char (*)[10]
,而&arrayB
的类型为char **
- 指针的地址。
对于arrayA
,这些指向相同的地址 - 但对于arrayB
,它们不会!有一个常见的C误解,“指针和数组是相同的” 。这是一个很好的例子,它们绝对不是绝对的,
答案 1 :(得分:2)
假设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
您的函数原型需要与您传递的任何表达式相匹配。如果您将该功能称为
func(&array);
那么函数原型需要
void func(void *(*arrp)[10]) {...}
如果您将此功能称为
func(&array[0]);
那么函数原型需要
void func(void **arrp) {...}
虽然在这种情况下你应该将数组的大小作为单独的参数传递。
现在,假设声明array
void **array = malloc(sizeof *array * N);
然后,表达式&array
和&array[0]
将产生不同的值和不同的类型。
Expression Type
---------- ----
&array void ***
&array[0] void **
&array
将为您提供array
变量本身的地址,该地址与为阵列分配的堆内存地址不同。同样,您的函数原型需要与您使用的表达式的类型相匹配。
答案 2 :(得分:0)
这不会编译,你正在使用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 *
。这些是不同的数据类型。
答案 3 :(得分:0)
如果array
确实是一个数组,那么
&array[0]
是指向array[]
&array
是指向整个array[]
所以,这两个表达式是不同的类型。如果你传递错误的一个代码,这可能会导致代码无法编译,这就是主要区别。
然而,在低级别,两个指针将保持相同的地址。
答案 4 :(得分:0)
是的,有一个很大的不同
&array[0]==>void**
和强>
&array==>void***