指向数组的指针作为函数参数

时间:2012-03-16 20:07:06

标签: c pointers

我写了一个函数,它接受一个指向数组的指针来初始化它的值:

#define FIXED_SIZE 256
int Foo(int *pArray[FIXED_SIZE])
{
/*...*/
}

//Call:

int array[FIXED_SIZE];
Foo(&array);

它没有编译:

  
    

错误C2664:'Foo':无法将参数1从'int(* __ w64)[256]'转换为'int * []'

  

但是,我一起黑了这个:

typedef int FixedArray[FIXED_SIZE];
int Foo(FixedArray *pArray)
{
/*...*/
}

//Call:

FixedArray array;
Foo(&array);

它有效。我在第一个定义中缺少什么?我以为这两个是等价的......

3 个答案:

答案 0 :(得分:14)

int Foo(int *pArray[FIXED_SIZE])
{
/*...*/
}

在第一种情况下, pArray是一个指针数组,而不是指向数组的指针

您需要括号来使用指向数组的指针:

int Foo(int (*pArray)[FIXED_SIZE])

您可以使用typedef免费获得此内容(因为它已经是一种类型,*具有不同的含义)。换句话说,typedef种类带有自己的括号。

注意:经验表明,在99%的情况下,有人使用指向数组的指针,他们可以并且实际上只应使用指向第一个元素的指针

答案 1 :(得分:2)

一件简单的事就是要记住顺时针螺旋规则,可以在这里找到 http://c-faq.com/decl/spiral.anderson.html

那将评估第一个是一个指针数组。第二个是指向固定大小数组的指针。

答案 2 :(得分:0)

数组衰减到指针。所以,它适用于第二种情况。在第一种情况下,函数参数是一个指针数组,但不是一个指向序列中第一个元素的整数的指针。