4

传递给 C 函数时 &array[0] 和 &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);
 }
4

5 回答 5

6

是的,有很大的不同,这取决于上下文。

考虑一下:-

char arrayA[10];
char *arrayB;

&arrayA[0]并且&arrayB[0]都有 type char *

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

对于arrayA,它们指向同一个地址 - 但对于arrayB它们没有!有一个常见的 C 误解,即“指针和数组是相同的”。这是一个很好的例子,说明他们绝对不是,

看到这个:http: //ideone.com/OcbuXZ

于 2013-02-19T10:56:28.563 回答
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);

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

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

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

于 2013-02-19T12:08:36.667 回答
0

如果array真的是一个数组,那么

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

因此,这两个表达式属于不同的类型。如果您传递了错误的两者之一,这可能会导致您的代码无法编译的主要区别。

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

于 2013-02-19T11:35:04.720 回答
0

是的,有很大的不同

&array[0]==>void** 

&array==>void***
于 2013-02-19T11:36:27.083 回答
0

这不会编译,您正在使用 avoid *并尝试获取它的第一个元素。但它有多大?编译器不知道。int *如果你不尝试这样的事情,使用可能会编译:

int main (void) {
  int *arr = malloc( 10 );

  arr = &arr[0]; // this is ok
  arr = &arr;    // wrong data type
}

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

于 2013-02-19T10:58:24.953 回答