为什么传递int(* p)[4]作为参数可以在函数中获取数组的大小?

时间:2017-06-04 22:10:55

标签: c++ c++11

我知道这是许多人之前提出过的一个主题,但我仍然对将数组作为参数传递给函数感到困惑。我想知道 这段代码中发生了什么,以及为什么当我尝试获取sizeof数组时它工作正常。

#include <iostream>


void function(int* parray, int(*array)[4])  //-> i dont get it
{


    int size = sizeof(*array)/sizeof(*parray);

   std::cout << &parray << std::endl;
   std::cout << *parray << std::endl;
   std::cout << *array  << std::endl;
}

int main(){

   int array[4]= {2,3,5,4};

   function(array,&array);


   return 0;
}

3 个答案:

答案 0 :(得分:1)

我会尝试解释它,即使我的C ++技能有点生疏。

void function(int* parray,int(*array)[4])

这是你的函数声明,你基本上有一个函数,它将指向int的指针作为第一个参数,并指向一个指向4个整数的数组作为第二个参数。

数组在C / C ++中很特殊,因为它们不是指针。好吧,也许一点点。

每当您将变量声明为

时,您所拥有的就是它
int* p

你告诉编译器这将是一个可以找到一个包含整数的内存空间的方向的地方。由于指针算术存在,p+1p+2等可能存在其他整数,编译器实际上并不知道。

另一方面,当你使用

int a[SIZE]

您告诉编译器这将是一个SIZE整数数组,并且您将使用名称a引用该数组。由于它不知道数组是什么,它只是分配足够的空间来拥有SIZE*sizeof(int)个字节,并使用a作为指向这个空间的指针。

关键区别在于编译器所知道的。 在第一种情况下,没有。 在第二个中,它知道引用指针它将找到足够的空间来容纳4个整数。

答案 1 :(得分:1)

因为标准中没有任何内容阻止它工作。

当您声明类型为T [N]T []的参数时,它实际上变为T *

因此,当您使用普通数组作为参数时,任何大小的信息都会丢失。无法从N

获取T *

int (*param)[N]不是数组。这是一个指针。它是否指向数组并不重要;只要param本身不是数组,就不会修改其类型。

答案 2 :(得分:-2)

T数组的类型是T (*)[N],但是一个简单的指针T*是不同的,我的指针并没有说明它指向了多少项。

所以我们有:

int a[4];
a; // type of a is "int (*)[4]"
&a; // the compiler doesn't change the type it's still "int (*)[4]
&a[0]; // it's now "int *"