C - 如何在2D数组中打印指针[0] [0]的值

时间:2016-03-26 12:04:10

标签: c arrays pointers enums

我想打印一个这样的电路板:enter image description here

在给定的代码中,我有这些值(不可更改的代码):

#ifndef BOARD_H
#define BOARD_H

#define BOARD_WIDTH 10
#define BOARD_HEIGHT 10

typedef enum cell
{
    EMPTY, //0
    BLOCKED, //1
    PLAYER //2
} Cell;

#define EMPTY_OUTPUT " "

Cell BOARD_1[BOARD_HEIGHT][BOARD_WIDTH];
Cell BOARD_2[BOARD_HEIGHT][BOARD_WIDTH];

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]);
void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH]);

我尝试过多种方式编写initialiseBoard(),如:

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
    int i, j;
    int *temp = NULL;

    for ( i = 0; i < 10; i++)
        for (j = 0; j < 10; j++)
            board[i][j] = EMPTY;
}

void initialiseBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
    int i, j;
    int *temp = NULL;

    for ( i = 0; i < 10; i++)
        for (j = 0; j < 10; j++)
        {
            if (i == 0 && j == 0)
            {
                *temp = EMPTY;
                board[0][0] = temp;
            }
            else
                board[i][j] = EMPTY;
        }
}

因为我知道[0] [0]中电路板中的第一个单元是一个指针,所以我尝试了很多方法来获取它的引用值,但它总是返回一个地址。请看下面的代码并建议我一个方法。非常感谢你!

void displayBoard(Cell board[BOARD_HEIGHT][BOARD_WIDTH])
{
    int i, j;
    for (i = 0; i <= 10; i++)
    {
        if (i == 0)
        {
            printf("\t|%s|", EMPTY_OUTPUT);
            for (j = 0; j < 10; j++)
                printf("%d|", j);
            printf("\n");
        }
        else
        {
            for (j = 0; j <= 10; j++)
            {
                if (j == 0)
                    printf("\t|%d|", i - 1);
                else
                {
                    char* c;

                    /*unsigned *p = &board[0][0];

                    if (i == 1 && j == 1)
                        c = (*p == EMPTY) ? EMPTY_OUTPUT : "?";*/

                    if (i == 1 && j == 1)
                        c = (board[0][0] == EMPTY) ? EMPTY_OUTPUT : "?";
                    else
                        c = (board[i - 1][j - 1] == EMPTY) ? EMPTY_OUTPUT : "?";
                    printf("%s|", c);
                }
            }
            printf("\n");
        }
    }
    printf("\n%d\n", board[0][0]); 
}

当我运行displayBoard()时:enter image description here

在[0] [0]时,它始终返回一个地址。

2 个答案:

答案 0 :(得分:0)

board[0][0]只是二维数组的基地址 如果你想在地址打印价值,它打印你的二维数组的基地址然后你应该使用'*'它显示你的情况下你应该使用*((board+0)+0)的地址值 如果有任何问题,你可以尝试这个并让我知道:)

答案 1 :(得分:0)

第一个initialiseBoard()函数是您要使用的函数。这样可以将所有2d数组元素正确设置为EMPTY。

显示电路板时,请记住阵列本身的地址和[0] [0]的地址是相同的地址。要查看存储在[0] [0]中的值,请取消引用该数组。存储在数组元素中的值是与您定义的枚举对应的数字。

   unsigned *arrayAddress = &board[0][0];
   printf( "2d array address is %p\n", arrayAddress );

   int arrayElemContent = board[0][0];
   printf( "2d array [0][0] content is %d\n", arrayElemContent );

   board[0][0] = BLOCKED;
   printf( "blocked is %d\n", board[0][0] );

在这种情况下,从数组中检索的元素是您之前定义的枚举中的int,因此使用%d打印它。