所以为了简短起见,我遇到的问题是让我改变预先构建的程序以包含指针。
这是一副纸牌和两只手。我(尝试)这样做,以便不是复制牌组的值并将它们放在手中,而是让手指向牌组中的牌。我知道它不是真正的甲板如何工作,但练习的目的只是习惯指针,而不是它的实用性(程序实际设置甲板的方式让我想撕掉我的头发) 。
我几乎已经掌握了将Ptr设置到卡座顶部的内存的基本语法,然后将其存储到手中。
然而,当我有手持阵列时会出现问题。手不等于卡座存储器,它是下一个可用存储器,但它仍具有相同的值,这意味着我没有指向它,我正在复制它。
这是原型功能
int dealHand(int wDeck[][FACES], int *wHand[HAND], int top);
以下是main
的定义和来电:
int *hand1[HAND] = {0};
int topDeck = 1;
topDeck = dealHand(deck, hand1, topDeck);
这是功能:
int dealHand(int wDeck[][FACES], int *wHand[HAND], int top) {
size_t hand;
size_t row;
size_t col;
int *arrayPtr;
for (hand = 0; hand < HAND; hand++) {
for (row = 0; row < SUITS; row++) {
for(col = 0; col < FACES; col++) {
if (wDeck[row][col] == top) {
printf("%d %d\n", row, col);
arrayPtr = &(wDeck[row][col]);
wHand[hand] = arrayPtr;
printf(" DECK: %p\n", &wDeck[row][col]);
printf(" DECK: %d\n", wDeck[row][col]);
printf("POINTER: %p\n", arrayPtr);
printf("POINTER: %d\n", *arrayPtr);
printf(" HAND: %p\n", &wHand[hand]);
printf(" HAND: %d\n", wHand[hand]);
} // if
} // row
} // col
top++;
} // hand
return top;
}
答案 0 :(得分:2)
为了存储指针,wHand
数组必须是一个指针数组:
// wDeck is a 2-dimensional array of ints.
// wHand is an array of pointers to ints.
void dealHand(int wDeck[][FACES], int *wHand[HAND]) {
wHand
数组的大小为HAND
,因此其索引从0
运行到HAND - 1
。 for
循环访问wHand[HAND]
时出错:
for (hand = 0; hand <= HAND; hand++) // Error: should be 0 to HAND-1.
arrayPtr
是指向wDeck
数组的指针,因此它必须包含元素的地址:
arrayPtr = &(wDeck[row][col]); // Parens are optional.
然后应该将地址复制到wHand
数组中,该数组现在包含指针,而不是int
s:
wHand[hand] = arrayPtr;
请注意,数组通常不带括号引用:
name[i][j]
而非(name)[i][j]
:
printf(" DECK: %p\n", &wDeck[row][col]);
printf(" DECK: %d\n", wDeck[row][col]);
// Similarly for printing the HAND data.
编辑:
现在您已将wHand[]
数组更改为包含指针,您还需要更新打印其值的方式:
printf(" HAND: %p\n", wHand[hand]); // Each element is a pointer.
printf(" HAND: %d\n", *wHand[hand]); // Print the int it points to.