In der Programmiersprache B, die der unmittelbare Vorgänger von C war, waren Zeiger und ganze Zahlen frei austauschbar. Das System würde sich so verhalten, als wäre der gesamte Speicher ein riesiges Array. Jedem Variablennamen war entweder eine globale oder eine stapelrelative Adresse zugeordnet. Für jeden Variablennamen musste der Compiler lediglich nachverfolgen, ob es sich um eine globale oder lokale Variable handelte, und seine Adresse relativ zur ersten globalen oder lokalen Variable.
Bei einer globalen Deklaration wie i;[es war nicht erforderlich, einen Typ anzugeben, da alles eine Ganzzahl / ein Zeiger war] würde der Compiler als: address_of_i = next_global++; memory[address_of_i] = 0;und eine Anweisung wie i++als: verarbeitet memory[address_of_i] = memory[address_of_i]+1;.
Eine Erklärung wie arr[10];würde als verarbeitet werden address_of_arr = next_global; memory[next_global] = next_global; next_global += 10;. Beachten Sie, dass der Compiler sofort vergessen kann arr, ein Array zu sein , sobald diese Deklaration verarbeitet wurde . Eine Anweisung wie arr[i]=6;würde als verarbeitet werden memory[memory[address_of_a] + memory[address_of_i]] = 6;. Dem Compiler ist es egal, ob arrer ein Array und ieine Ganzzahl darstellt oder umgekehrt. In der Tat wäre es egal, ob sie beide Arrays oder beide Ganzzahlen wären; Es würde den Code wie beschrieben sehr gerne generieren, ohne Rücksicht darauf, ob das resultierende Verhalten wahrscheinlich nützlich wäre.
Eines der Ziele der Programmiersprache C war es, weitgehend mit B kompatibel zu sein. In B identifizierte der Name eines Arrays [in der Terminologie von B als "Vektor" bezeichnet] eine Variable, die einen Zeiger enthielt, auf den ursprünglich gezeigt wurde auf das erste Element einer Zuordnung der angegebenen Größe. Wenn dieser Name also in der Argumentliste für eine Funktion erscheint, erhält die Funktion einen Zeiger auf den Vektor. Obwohl C "echte" Array-Typen hinzufügte, deren Name fest mit der Adresse der Zuordnung verknüpft war und nicht mit einer Zeigervariablen, die anfänglich auf die Zuordnung verweisen würde, zerlegen sich Arrays in Zeiger, deren Code, der ein Array vom Typ C deklariert, sich identisch verhält zu B-Code, der einen Vektor deklariert und dann die Variable, die seine Adresse enthält, nie geändert hat.