Beides sind Varianten, die identische HANDLUNGEN ausdrücken und damit zu identischem Maschinencode und identischem Verhalten führen, aber syntaktisch dem Programmierer gegenüber unterschiedlich erscheinen.
Kurzdarstellung: Eine Referenz ist ein IMPLIZIT DEREFERENZIERTER Pointer. (Der Compiler erledigt das zur Compilezeit, gelle? Mit dem Verhalten zur Laufzeit hat das mitnichten was zu tun!)
Das führt dazu, daß der Programmierer bei einer Referenz KEINE DEREFERENZIERUNG im Quelltext notieren braucht (und das auch nicht darf, gelle?), um an denn Variablenwert zu kommen.
Das wiederum führt aber im Gegenzug auch dazu, daß der Programmierer bei einer Referenz im Nachhinein nicht mehr den Zeiger verändern kann.
Dieses Verhalten kann man sich AUCH als implizites Suchen/Ersetzen vorstellen: Immer, wenn man eine Referenz hinschreibt, ist dies dasselbe, als hätte man einen Pointer hingeschrieben UND eine Dereferenzierung an diesen dran. Bzw. überall, wo man eine Pointer-Dereferenzierung notiert, kann man das auch gleich als Referenz schreiben.
Fazit: Mit Referenzen hat man es als Programmierer syntaktisch LEICHTER, Pointer zu verwenden, und zwar GENAU DANN, wenn diese Pointer nicht die Stelle ändern brauchen, wo sie hin zeigen.
Danke, das ist interessant.
Also völlig richtig, der Funktionsaufruf Call-by-Pointer war mir nicht bekannt und hab mich noch mal belesen. Tatsächlich scheint es den Aufruf Call-by-Reference nicht bei allen Programmiersprachen zu geben, allerdings in C++, was einiges erleichter, wie von WhiteGandalf beschrieben.