我想在函数中操作一个整数数组,但我不确定是否应该使用地址前缀或指针前缀:
void shuffle(int *deck[]){
//statements
}
或
void shuffle(int &deck[]){
//statements
}
此外,当我直接想要操纵数组的值时,我不确定是否应该使用(在函数内)
*deck[4] = 34
或其他。
任何澄清都表示赞赏。
答案 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 ++)选项是使用卡片的向量并将引用传递给向量。