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

6
我写了一个函数,它接受一个指向数组的指针来初始化其值:
#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个回答

15
int Foo(int *pArray[FIXED_SIZE])
{
/*...*/
}
在第一种情况中,pArray是指针的数组,而不是指向数组的指针。 使用指向数组的指针需要加括号:
int Foo(int (*pArray)[FIXED_SIZE])

使用 typedef 时可以免费获得这个(因为它已经是一个类型,所以 * 有了不同的含义)。换句话说,typedef 似乎自带括号。

注意:经验表明,在99%的情况下,当某人使用指向数组的指针时,他们实际上只需要使用指向第一个元素的指针。


是的,指向第一个元素的指针以及大小(如果需要的话,很可能需要)。 - Ed S.

1

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

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


0
一个数组会衰变成一个指针。所以,在第二种情况下它可以工作。而在第一种情况下,函数参数是一个指向指针的数组,而不是一个指向序列中第一个元素的整数指针。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接