W języku programowania B, który był bezpośrednim poprzednikiem C, wskaźniki i liczby całkowite były swobodnie zamienne. System zachowywałby się tak, jakby cała pamięć była gigantyczną tablicą. Każda nazwa zmiennej miała powiązany z nią adres globalny lub względny dla stosu, dla każdej nazwy zmiennej kompilator musiał tylko śledzić, czy była to zmienna globalna, czy lokalna, oraz jej adres względem pierwszej globalnej lub lokalnej zmienna.
Biorąc pod uwagę globalne deklaracja jak i;
[nie było potrzeby, aby określić typ, ponieważ wszystko było liczbą całkowitą / wskaźnik] będą przetwarzane przez kompilator jako: address_of_i = next_global++; memory[address_of_i] = 0;
a oświadczeniu jak i++
będą przetwarzane jako: memory[address_of_i] = memory[address_of_i]+1;
.
Deklaracja taka jak arr[10];
byłaby przetwarzana jako address_of_arr = next_global; memory[next_global] = next_global; next_global += 10;
. Zauważ, że gdy tylko ta deklaracja została przetworzona, kompilator mógł natychmiast zapomnieć o arr
byciu tablicą . Oświadczenie, takie jak arr[i]=6;
, będzie przetwarzane jako memory[memory[address_of_a] + memory[address_of_i]] = 6;
. Kompilator nie przejmowałby się tym, czy arr
reprezentował tablicę i i
liczbę całkowitą, czy odwrotnie. Rzeczywiście, nie obchodziło by, gdyby obie były tablicami czy obiema liczbami całkowitymi; całkowicie szczęśliwie wygenerowałoby kod zgodnie z opisem, bez względu na to, czy wynikowe zachowanie byłoby prawdopodobnie przydatne.
Jednym z celów języka programowania C było zapewnienie dużej zgodności z B. W B, nazwa tablicy [zwanej „wektorem” w terminologii B] identyfikowała zmienną zawierającą wskaźnik, który początkowo był przypisany do do pierwszego elementu alokacji o podanym rozmiarze, więc gdyby ta nazwa pojawiła się na liście argumentów funkcji, funkcja otrzymałaby wskaźnik do wektora. Mimo że C dodał "prawdziwe" typy tablic, których nazwa była sztywno powiązana z adresem alokacji, a nie zmienną wskaźnikową, która początkowo wskazywałaby na alokację, posiadanie tablic rozkładających się na wskaźniki tworzyło kod, który zadeklarował tablicę typu C zachowuje się identycznie do kodu B, który zadeklarował wektor, a następnie nigdy nie modyfikował zmiennej przechowującej jego adres.