传递给C函数时& array [0]和&数组之间的差异

时间:2013-02-19 10:49:11

标签: c

传递给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);
 }

5 个答案:

答案 0 :(得分:6)

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

考虑一下: -

char arrayA[10];
char *arrayB;

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

&arrayA的类型为char (*)[10],而&arrayB的类型为char ** - 指针的地址。

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

请参阅:http://ideone.com/OcbuXZ

答案 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[]
  • 的元素0的指针
  • &array是指向整个array[]
  • 的指针

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

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

答案 4 :(得分:0)

是的,有一个很大的不同

&array[0]==>void** 

&array==>void***