首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >传递给C函数时&array[0]和&array之间的差异

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

Stack Overflow用户
提问于 2013-02-19 18:49:11
回答 5查看 3.6K关注 0票数 4

当传递给C函数时,&array和&array有区别吗?此数组是一个void*数组,当前以整数作为数据。

添加了测试代码

代码语言:javascript
复制
#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);
 }
EN

回答 5

Stack Overflow用户

发布于 2013-02-19 18:56:29

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

请考虑以下内容:

代码语言:javascript
复制
char arrayA[10];
char *arrayB;

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

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

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

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

票数 6
EN

Stack Overflow用户

发布于 2013-02-19 20:08:37

假设声明了array

代码语言:javascript
复制
void *array[N];

则表达式&array[0]&array将产生相同的值(数组的第一个元素的地址与数组本身的地址相同),但类型不同。

代码语言:javascript
复制
Expression        Type
----------        ----
    &array        void *(*)[10]  -- pointer to 10-element array of `void *`
  &array[0]       void **        -- pointer to pointer to void

您的函数原型需要与您传递的任何表达式相匹配。如果您将该函数调用为

代码语言:javascript
复制
func(&array);

然后,函数原型需要

代码语言:javascript
复制
void func(void *(*arrp)[10]) {...}

如果您将该函数调用为

代码语言:javascript
复制
func(&array[0]);

然后,函数原型需要

代码语言:javascript
复制
void func(void **arrp) {...}

尽管在这种情况下,您应该将数组的大小作为单独的参数进行传递。

现在,假设声明了array

代码语言:javascript
复制
void **array = malloc(sizeof *array * N);

然后,表达式&array&array[0]将产生不同的值和不同的类型。

代码语言:javascript
复制
Expression        Type
----------        ----
    &array        void ***  
 &array[0]        void **   

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

票数 2
EN

Stack Overflow用户

发布于 2013-02-19 18:58:25

这不能编译,您正在使用void *并尝试获取它的第一个元素。但是它有多大尺寸呢?编译器不知道。使用int *可能会编译,如果您没有尝试这样的东西:

代码语言:javascript
复制
int main (void) {
  int *arr = malloc( 10 );

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14955574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档