C: Возможен ли символ в квадратных скобках массива? - PullRequest
0 голосов
/ 25 мая 2018

До сегодняшнего дня мой ответ был бы следующим: «Нет, в нем должно быть целое число, определяющее положение массива.»

Но теперь я получил этот фрагмент кода (для декодирования 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, мы получаем первую позицию encoding_table массива, поэтому encoding_table[0] == 'A'.Это преобразуется в unsigned char, так что все равно 'A'.Итак, у нас есть: decoding_table['A'] = 0;

Символ, который определяет положение массива, является новым для меня.Как это работает?Вместо этого используется целочисленный эквивалент таблицы ASCII (65 вместо 'A')?Или я неправильно понимаю, что делает этот код, и я выгляжу как полный нуб?

Ответы [ 2 ]

0 голосов
/ 25 мая 2018

Литерал 'A' - это - в соответствии с набором символов вашей системы, представлен как целое значение, например, 65 в ASCII.Кстати - тип данных литерала integer, а не char, но здесь это не имеет большого значения.

Ваша таблица кодирования представляет собой массив char, и если по умолчанию ваша система имеет значение signed char для char, то интегральное значение 65 будет сохранено как signed char, то есть 8-битное целое значение со знаком.

И наоборот, если вы пишете decoding_table[(unsigned char) encoding_table[i]], то знаковое значение8-битное интегральное значение 65 из encoding_table[i] преобразуется в 8-битное целое значение без знака, все еще давая 65.Приведение к unsigned - хорошая идея, так как 8-битный символ со знаком может быть отрицательным, давая что-то вроде, например, decoding_table[-10].Это было бы неопределенным поведением, поскольку он обращался к массиву за его пределами.

Таким образом, вы предполагаете, правильно: вы можете рассматривать литералы символов как целые значения, и, следовательно, вы можете использовать его как индекс массива.

0 голосов
/ 25 мая 2018

Вам нужно целое число для позиции массива, но char - это просто 8-битное целое число.На самом деле, все, что вы можете добавить к указателю, может быть использовано в скобках, потому что array[5] - это то же самое, что и *(array+5).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...