当传递给C函数时,&array和&array有区别吗?此数组是一个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);
}发布于 2013-02-19 18:56:29
是的,这有很大的不同,这取决于上下文。
请考虑以下内容:
char arrayA[10];
char *arrayB;&arrayA[0]和&arrayB[0]都有char *类型。
但是&arrayA的类型是char (*)[10],而&arrayB的类型是char ** -指针的地址。
对于arrayA,它们指向相同的地址-但对于arrayB,则不是!C中有一个常见的误解,即“指针和数组是相同的”。这是一个很好的例子,说明了它们绝对不是,
看看这个:http://ideone.com/OcbuXZ
发布于 2013-02-19 20:08:37
假设声明了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变量本身的地址,该地址与为数组分配的堆内存的地址不同。同样,您的函数原型需要与您使用的表达式的类型相匹配。
发布于 2013-02-19 18:58:25
这不能编译,您正在使用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 *。这些是不同的数据类型。
https://stackoverflow.com/questions/14955574
复制相似问题