使Array指向另一个数组C的内存

时间:2014-04-18 20:55:35

标签: c arrays function pointers

所以为了简短起见,我遇到的问题是让我改变预先构建的程序以包含指针。

这是一副纸牌和两只手。

我(尝试)这样做,以便不是复制牌组的值并将它们放在手中,而是让手指向牌组中的牌。我知道它不是真正的甲板如何工作,但练习的目的只是习惯指针,而不是它的实用性(程序实际设置甲板的方式让我想撕掉我的头发) 。

我几乎已经掌握了将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;
}

1 个答案:

答案 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 - 1for循环访问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.