В языке программирования B, который был непосредственным предшественником C, указатели и целые числа были свободно взаимозаменяемыми.Система будет вести себя так, как будто вся память представляет собой гигантский массив.С каждым именем переменной связан либо глобальный, либо относящийся к стеку адрес, для каждого имени переменной единственное, что должен отслеживать компилятор, это глобальная или локальная переменная и его адрес относительно первой глобальной или локальной переменной.переменная.
Учитывая глобальное объявление типа i;
[нет необходимости указывать тип, так как все было целым числом / указателем] будет обрабатываться компилятором как: address_of_i = next_global++; memory[address_of_i] = 0;
и оператором, подобным i++
будет обработано как: memory[address_of_i] = memory[address_of_i]+1;
.
Объявление типа arr[10];
будет обработано как address_of_arr = next_global; memory[next_global] = next_global; next_global += 10;
.Обратите внимание, что как только это объявление было обработано, компилятор мог сразу забыть о том, что arr
является массивом .Оператор типа arr[i]=6;
будет обработан как memory[memory[address_of_a] + memory[address_of_i]] = 6;
.Компилятору не важно, представляет ли arr
массив, а i
- целое число, или наоборот.Действительно, было бы все равно, если бы они были массивами или обоими целыми числами;он с удовольствием сгенерирует код, как описано, независимо от того, будет ли, вероятно, полезное поведение в результате.
Одна из целей языка программирования C заключалась в большей совместимости с B. В языке B названиемассива [называемый «вектор» в терминологии B] идентифицировал переменную, содержащую указатель, который изначально был назначен для указания на первый элемент выделения данного размера, поэтому, если это имя появилось в списке аргументов дляфункция, функция получит указатель на вектор.Несмотря на то, что C добавил «реальные» типы массивов, чье имя было жестко связано с адресом выделения, а не с переменной-указателем, которая первоначально указывала бы на выделение, наличие массивов, разлагаемых на созданный указателями код, который объявил массив типа C, ведет себя идентичнов код B, который объявил вектор, а затем никогда не изменял переменную, содержащую ее адрес.