C:数组的方括号之间是否有char?

a k*_*son 0 c arrays base64 character square-bracket

直到今天,我的回答是:"不,它必须有一个整数,它决定了数组的位置."

但现在我从我们的教授那里获得了这段代码片段(用于base64解码),我也在stackoverflow和其他网站上找到了它:

static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
                                'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
                                'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
                                'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
                                'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
                                'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
                                'w', 'x', 'y', 'z', '0', '1', '2', '3',
                                '4', '5', '6', '7', '8', '9', '+', '/'};
static char *decoding_table = NULL;

void build_decoding_table1() {

    int i;
    decoding_table = malloc(256);

    for (i = 0; i < 64; i++)
        decoding_table[(unsigned char) encoding_table[i]] = i;
}
Run Code Online (Sandbox Code Playgroud)

让我感到惊讶的是:

decoding_table[(unsigned char) encoding_table[i]] = i;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么 - 至少我认为发生了什么 - 例如当i==时0,我们得到encoding_table-array 的第一个位置,所以encoding_table[0]== 'A'.得到了unsigned char,所以它仍然存在'A'.所以我们有:decoding_table['A'] = 0;

确定阵列位置的char对我来说是新的.这是如何运作的?是否使用了ASCII表的整数等价(65而不是'A')?或者我是否误解了这段代码的作用,而且我作为一个完整的菜鸟在外面?

Ste*_*ner 5

Literal 'A'是 - 根据您系统的字符集,表示为整数值,例如65ASCII.顺便说一句 - 文字的数据类型integer不是char,但这在这里并不重要.

你的编码表是一个数组char,如果你的系统默认signed charchar,则积分值65将被存储为一个signed char,即8位整型值.

反过来说,如果你写decoding_table[(unsigned char) encoding_table[i]],那么带符号的8位整数值65encoding_table[i]被转换为无符号8位整数值,仍然给出65.转换为unsigned是一个好主意,因为8位有符号的char可能是负数,例如,给出类似的东西decoding_table[-10].这将是未定义的行为,因为它从其边界访问数组.

所以你假设正确:你可以将字符文字视为整数值,因此你可以将它用作数组索引.