通过引用将数组传递给函数参数

时间:2012-09-04 04:16:27

标签: c

我想在函数中操作一个整数数组,但我不确定是否应该使用地址前缀或指针前缀:

void shuffle(int *deck[]){  
    //statements
}

void shuffle(int &deck[]){  
    //statements
}

此外,当我直接想要操纵数组的值时,我不确定是否应该使用(在函数内)

*deck[4] = 34

或其他。

任何澄清都表示赞赏。

6 个答案:

答案 0 :(得分:3)

C中没有引用(您的Q仅标记为C ),因此您必须使用指针版本。

当你说一个数组传递给函数时,你实际传递给函数的是指向它的第一个元素的指针,以下两个语法对编译器来说都是一个相同的东西:

void shuffle(int *p_deck); 
void shuffle(int deck[]);

答案 1 :(得分:0)

C没有引用(a),那就是C ++。

在C中,X的数组在传递给函数时会衰减为指向X[0]的指针,因此一种方法是使用:

void shuffle (int *pDeck) {
    // use pDeck[something]
}
:
int deck[] = {0,1,2,3,4,5,6,7,8,9};
shuffle (deck);

我实际上更喜欢这种方法到void shuffle (int pDeck[])变体,因为前者非常清楚你现在处理的是指针而不是数组。

这很重要的原因是因为你在这样做时丢失了尺寸信息,所以你可能也想要传递它:

void shuffle (int *pDeck, size_t sz) {
    // use pDeck[0 thru sz-1]
}
:
int deck[] = {0,1,2,3,4,5,6,7,8,9};
shuffle (deck, sizeof (deck) / sizeof (*deck));

(a):虽然它们是非常不错的功能。我希望ISO将它们视为下一个C标准,因为该语言的新手很多都涉及指针,而引用可以很好地隐藏它的复杂性。

答案 2 :(得分:0)

当传递给函数时,数组会衰减为指针,所以在这里使用额外的间接级别是没有意义的。

根据C99标准的§6.3.2.1,

  

除非它是sizeof运算符或一元&运算符的操作数,否则是   用于初始化数组的字符串文字,类型为“ type ”数组的表达式将转换为类型为“指向 type 的指针”的表达式,该表达式指向初始元素数组对象并不是左值。如果数组对象具有寄存器存储类,则行为未定义。

void shuffle(int deck[]) {
  ...
}

请注意,C不支持引用,只支持指针。你可能在想C ++。

答案 3 :(得分:0)

你必须使用指针版本,但由于左右规则,我相信你的:

int * deck[]实际上是一个int指针数组,而不是一个int数组。

http://cseweb.ucsd.edu/~ricko/CSE131/rt_lt.rule.html

您应该只传递对数组中第一个元素的引用:

int * deck但您可能希望传入数组的大小,以避免超出范围。

答案 4 :(得分:0)

都不是。

由于数组只能通过引用传递,所以你不需要做技巧,只需传递一个指针并取消引用它。 (无论如何,涉及& in your 2nd function的语法无效)。所以:

void shuffle(int arr[])
{
    arr[0] = 1337;
}

void shuffle(int *arr)
{
}

等。你可以这样传递它:

int deck[52];
shuffle(deck);

答案 5 :(得分:0)

如果指定数组的大小,则可以通过C ++引用传递数组:

void shuffle(int (&deck)[52])
{
   deck[4] = 34;
}

如果您不知道大小,或者您只限于C,则需要使用指针。

另一个(C ++)选项是使用卡片的向量并将引用传递给向量。