В языке программирования 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, который объявил вектор, а затем никогда не изменял переменную, содержащую ее адрес.