繁体   English   中英

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

[英]Pass an array by reference into function argument

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

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

要么

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

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

*deck[4] = 34

或者是其他东西。

任何澄清表示赞赏。

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

当您说将数组传递给函数时,本质上传递给该函数的是指向其第一个元素的指针,以下两种语法对编译器而言都是相同的:

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

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标准中考虑它们,因为指针的新问题涉及该语言的许多新手,而引用可以很好地隐藏其复杂性。

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

根据C99标准的§6.3.2.1,

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

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

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

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

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

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

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

int * deck但您可能希望传入数组的大小,以免越界。

都不行

由于数组只能通过引用传递,因此您无需做任何技巧,只需传递一个指针并将其取消引用即可。 (无论如何,在第二个函数中包含&的语法都是无效的)。 所以:

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

要么

void shuffle(int *arr)
{
}

等等。您可以像这样通过它:

int deck[52];
shuffle(deck);

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

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

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

另一个(C ++)选项是将矢量用于平台,并将引用传递给该矢量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM