unsigned char mat[24][8]
24 * 8 * sizeof(char)バイトのメモリチャンクが得られるため、もちろんビットを変更できます。(ここから unsigned char は 1 バイト (=8 ビット)、unsigned int は 4 バイト (=32 ビット) であると仮定しますが、これはシステムに依存する可能性があります。
ただし、4 バイト幅の要素へのポインタを使用して 1 バイト幅のメモリ要素にアクセスするのは難しく、簡単にエラーが発生する可能性があります。
たとえば、int 配列の要素 0 を 1 に設定すると、
#define ROWS 24
#define COLS 8
unsigned char mat[ROWS][COLS];
unsigned int * val = (unsigned int*)&mat;
val[0] = 1;
mat[0][0] が 0、mat[0][1] が 0、mat[0][2] が 0、mat[0][3] が 1 であることがわかります。
このような「タイプミス」ポインターを介してメモリ内のオフセットを使用して、 mat の要素を直接編集することはできないことに注意してください。val[10*8+4]
たとえば、アクセスすると、192 バイトしかないメモリ チャンクの先頭からバイト 336 にアクセスします。
インデックスを正しく計算する必要があります。
size_t byte_index = (10*COLS+4)*sizeof(unsigned char); // will be 84
size_t int_index = byte_index / sizeof(unsigned int); // will be 21
size_t sub_byte = byte_index%sizeof(unsigned int); // will be 0
したがって、参照する unsigned int 値のバイト数である要素 mat[10][4] のデータを含む 4 バイトにアクセスval[int_index]
またはアクセスできます。val[21]
sub_byte
同じタイプの場合、正しいオフセットを計算する必要があることを除けば問題はありません。
#define ROWS 24
#define COLS 8
unsigned char mat[ROWS][COLS];
unsigned char * val = &mat;
val[10*8+4] = 12; // set mat[10][4] to 12
*(val+10*8+5) = 13; // set mat[10][5] to 13