【问题标题】:C - how to print the value of the pointer [0][0] in a 2D arrayC - 如何在二维数组中打印指针 [0][0] 的值
【发布时间】:2016-03-26 12:04:09
【问题描述】:

我想打印这样的板:

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

#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() 时:

在 [0][0] 处,它总是返回一个地址。

【问题讨论】:

  • 请构造一个minimal test-case
  • 指针地址。你想打印这个指针指向的数据吗?就目前而言,您已将 tmp 指向的值设置为保存 0(空),然后将 [0][0] 的值设置为保存 tmp 的地址(指针,NOT 值 EMPTY) 位于。
  • 第一个单元格与其他单元格没有区别,因此您无需以任何特定方式处理它。此外,您通过使用循环中的 0 来打印边界会使事情复杂化。只需在循环之外打印它们。您还没有展示如何调用这些函数。
  • 请将编译器的警告/错误报告设置为合理的设置。您会立即收到@enhzflep 提到的问题的通知,因为您正在将int* 转换为int
  • @SamiKuhmonen - 好建议,我没有想到这一点 - 我想我的评论对 Jay 回想起来有些无益。

标签: c arrays pointers enums


【解决方案1】:

board[0][0] 只是二维数组的基地址 如果您想在地址处打印值,它正在打印二维数组的基地址,那么您应该使用'*' 它在您的情况下显示地址处的值,您应该使用*((board+0)+0) 你可以试试这个,如果有任何问题,请告诉我:)

【讨论】:

  • 最后一条语句——你能把它删掉吗!如果您不是“确定”,那么您为什么要写答案?修改你的答案。
  • board[0][0]
  • 我试过了,编译时得到这个警告:格式指定类型'int'但参数的类型是'Cell *'
  • 很抱歉,实际上我没有编译 c 代码的环境,这就是我这么说的原因,但是感谢指导我,我是它的新用户,我正在删除它
【解决方案2】:

第一个 initialiseBoard() 函数是您要使用的函数。这会正确地将所有二维数组元素设置为 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 打印它。

【讨论】:

    猜你喜欢
    • 2016-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 2012-08-31
    • 2022-11-26
    • 2017-04-26
    相关资源
    最近更新 更多