[英]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.