簡體   English   中英

二維數組上下文中的C指針

[英]C pointers in a 2-D array context

這是一個具有8 x 8陣列的工作程序,代表一個小型棋盤。 實際的棋盤為4 x 4,並在數組中填充零。

// Chessboard representation
//
#include <stdio.h>

unsigned char uuboard[8][8]={
{1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1},
{1,1,0,0,0,0,1,1}, {1,1,0,0,0,0,1,1},   
{1,1,0,0,0,0,1,1}, {1,1,0,0,0,0,1,1},   
{1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1} };     

unsigned char *uboard[8]={uuboard[0]+2, uuboard[1]+2, uuboard[2]+2, uuboard[3]+2,
                          uuboard[4]+2, uuboard[5]+2, uuboard[6]+2, uuboard[7]+2};
unsigned char **board=uboard+2;

int main(void) {
    // Make a change to the board directly, using 2-D array
    uuboard[3][3] = 8;
    printf("Print the board by accessing the 2-D array directly\n");
    for (int i=0;i<8;i++) {
        for (int j=0;j<8;j++) {
            printf("%d", uuboard[i][j]);
        }
        printf("\n");
    }
    printf("Print again using pointers\n");
    for (int i=0; i<4; i++, printf("\n")) {
      for (int j=0; j<4; j++) {
          printf("%d", board[i][j]);
      }
    }
    printf("\n");   
    return 0;
}

原始程序員似乎使用指針,因此他/她通過從0而不是2開始索引來到達實際的棋盤方塊。 *uboard[8]**board如何工作? 非常感謝您提供任何答案或對答案的引用。

unsigned char *uboard[8]={uuboard[0]+2, uuboard[1]+2, uuboard[2]+2, uuboard[3]+2, uuboard[4]+2, uuboard[5]+2, uuboard[6]+2, uuboard[7]+2};  

相當於

unsigned char *uboard[8]={&uuboard[0][2], &uuboard[1][2], &uuboard[2][2], &uuboard[3][2], &uuboard[4][2], &uuboard[5][2], &uuboard[6][2], &uuboard[7][2]};  

unsigned char **board=uboard+2;  

相當於

unsigned char **board = &uboard[0]+2; 
// or 
unsigned char **board = &uboard[2];

在這里,無符號字符* uboard [8]是一個指針數組,可以存儲8個指向無符號字符的指針。 現在,uboard [0] = uuboard [0] +2。

  • uuboard [0]是指向8個字符的數組的指針-> {1,1,1,1,1,1,1,1},即uuboard [8] [8]中的第一個數組。
  • uboard [0] + 2表示-> uboard [0] +接下來的2個8個字符的數組的內存(由於指針的類型為char(*)[8]->指向8個字符的數組的指針。)因此,uboard [0] +2 = uboard [2]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM