0

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

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

或者

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

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

*deck[4] = 34

或者是其他东西。

任何澄清表示赞赏。

4

6 回答 6

3

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

当您说将数组传递给函数时,实际上传递给函数的是指向其第一个元素的指针,以下两种语法对编译器意味着相同且相同的东西:

void shuffle(int *p_deck); 
void shuffle(int deck[]);
于 2012-09-04T04:18:30.820 回答
0

您将不得不使用指针版本,但由于左右规则,我相信您的:

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

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

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

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

于 2012-09-04T04:21:49.297 回答
0

两者都不。

由于数组只能通过引用传递,因此您不需要做任何技巧,只需传递一个指针并取消引用它。(无论如何,在你的第二个函数中涉及 & 的语法是无效的)。所以:

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

或者

void shuffle(int *arr)
{
}

等等,你可以像这样传递它:

int deck[52];
shuffle(deck);
于 2012-09-04T04:22:04.083 回答
0

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

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

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

另一个 (C++) 选项是使用向量作为卡片组,并改为传递对向量的引用。

于 2012-09-04T04:23:34.893 回答
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 标准,因为该语言的新手遇到的大量问题都与指针有关,而引用可以很好地隐藏其复杂性。

于 2012-09-04T04:18:34.390 回答
0

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

根据 C99 标准的 §6.3.2.1,

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

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

请注意,C 不支持引用,只支持指针。您可能正在考虑 C++。

于 2012-09-04T04:19:03.283 回答