直到今天,我的回答是:"不,必须有一个整数,它决定数组的位置。"
但是现在我从我们的教授那里获得了这段代码片段(用于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;
}
令我感到惊讶的是:
decoding_table[(unsigned char) encoding_table[i]] = i;
这里发生了什么 - 至少我认为发生了什么 - 例如,当i
== 0
时,我们得到了{{1}的第一个位置} -array,所以encoding_table
== encoding_table[0]
。这会被转换为'A'
,因此它仍然是unsigned char
。所以我们有:'A'
确定阵列位置的char对我来说是新的。这是如何运作的?是否使用了ASCII表的整数等值(decoding_table['A'] = 0;
而不是65
)?或者我是否误解了这段代码的作用,而且我作为一个完整的菜鸟出去了我?
答案 0 :(得分:5)
文字'A'
是 - 根据您系统的字符集,表示为整数值,例如ASCII中的65
。顺便说一句 - 文字的数据类型是integer
,而不是char
,但这并不重要。
您的编码表是char
的数组,如果您的系统默认为signed char
char
,则整数值65将存储为{{ 1}},即8位有符号整数值。
反过来说,如果你写signed char
,那么来自decoding_table[(unsigned char) encoding_table[i]]
的带符号8位整数值65
将被转换为无符号8位整数值,仍然给出{{1} }}。转换为unsigned是一个好主意,因为8位有符号的char可能是负数,例如encoding_table[i]
。这将是未定义的行为,因为它从其边界访问数组。
所以你假设正确:你可以将字符文字视为整数值,因此你可以将它用作数组索引。
答案 1 :(得分:2)
数组位置需要一个整数,但char
只是一个8位整数。实际上,您可以添加到指针的任何内容都可以在括号中使用,因为array[5]
与*(array+5)
相同。