结构外部的指针和结构内部的指针指向同一个数组并且具有不同的存储地址

A pointer outside a structure and a pointer inside a structure point to same array and have different stored address

我正在尝试设置一个结构数组,该数组将元素的地址存储在名为 map 的二维数组中。 我可以得到一个地址存储在结构成员中,但它不是map数组的地址。

我能够在 FIELD[][].pos 中存储地址值并在 FIELD[][].symbol 中设置 char 值并将它们打印到屏幕上。但是当我尝试将 map[][] 中的值打印到屏幕时,它们不匹配。 所以我添加了 int *map_ptr = &map[0][0],结果我从 map_ptr 得到的地址与我从 FIELD[0][0] 得到的地址不匹配。 pos 和我不明白为什么它们会不同。

struct field 能够成功地将地址值存储在 FIELD[i][j].pos 中,并且 FIELD[i][j].pos = &FIELD[i][j].symbol 似乎可以作为故意的。但是当我直接从 map[][] 和 FIELD 打印出 map[][] 到屏幕时,我得到了不同的结果。所以我添加了 int *map_ptr = &map[0][0] 来比较指针地址,结果发现我的 FIELD[][].pos 中的地址与 map[][] 的实际地址不匹配.

char map[5][5];
map[0][0] = '#';
char *map_ptr = &map[0][0];
printf("map_ptr = %d, %d, %c\n", &map_ptr, *map_ptr, *map_ptr);
printf("\n");

struct field
{
    char *pos;
    char symbol;
}FIELD[5][5];

for(i=0; i<5; i++)
{
    for(j=0; j<5; j++)
    {
        FIELD[i][j].pos = &map[i][j];
        FIELD[i][j].symbol = '#';
        FIELD[i][j].pos = &FIELD[i][j].symbol;
    }
}

/* Prints memory address FIELD[i][j].pos */
printf("Address from struct field FIELD[i][j].pos = ");
printf("%d \n", FIELD[0][0].pos)

map_ptr和FIELD[0][0].pos中的地址应该是一样的,应该指向map[0][0]的地址,但不是。

这是我打印的地址值:` map_ptr = 6422256, 35, #

来自结构字段 FIELD[i][j].pos = 6422060 的地址`

一个问题是您没有打印 map_ptr 指向的位置(即 map_ptr 的值),而是变量 map_ptr 的位置(地址) .在您的通话中删除运营商地址。

另一个问题是您重新分配 FIELD[i][j].pos,使其指向 FIELD[i][j].symbol。我猜测作业确实应该是

*FIELD[i][j].pos = FIELD[i][j].symbol;

另请注意,您应该使用格式 "%p" 来打印(void *,确实需要转换)指针,不匹配的格式说明符和参数类型会导致 未定义的行为.

您已将 FIELD[i][j].pos 重新分配给 &FIELD[i][j].symbol