Zeigerarithmetik
-
probier mal so...
void sswap(float* p1, float* p2){float temp;temp=*p1;*p1=*p2;*p2=temp;}
Es gibt in C kein 'call by reference'
und was hat das mit der frage zu tun?...
-
@Windalf:Das ist mir schon klar, dass die erste Variante funktioniert.
Ich will aber wissen, _warum_ meine Variante _nicht_ funktioniert.
-
Windalf schrieb:
Es gibt in C kein 'call by reference'
und was hat das mit der frage zu tun?...
Auch Zeiger werden kopiert, womit Änderungen auf den Zeigern nach dem Verlassen der Funktion verschwinden, was dem OP anscheinend nicht klar ist.
Wurde hier auch im Forum schon diverse Male falsch kolportiert (im Sinne von: int wird 'by value' übergeben, willst Du 'by reference' nimm int*), was zumindest eine stark sinnentstellende Kürzung darstellt.
-
@Daniel E
Er hat in seinem Quellcode keine Referenzen verwendet deshalb fand ichs ein wenig eigenartig aber anscheinend warst du doch eher auf der richtigen spur da er nicht wollte das die zeiger kopiert werden...@_MatriX_
wenn du die zeiger direkt ändern willst musst du zeiger auf zeiger verwenden... (macht aber in deinem beispiel nicht wirklich sinn)
-
Was das mit Zeigerarithmetik zu tun hat, weiß ich nicht, aber das hier ist genau das, was du suchst: http://www.c-plusplus.net/forum/viewtopic-var-t-is-106136.html
-
Daniel E. schrieb:
Wurde hier auch im Forum schon diverse Male falsch kolportiert (im Sinne von: int wird 'by value' übergeben, willst Du 'by reference' nimm int*), was zumindest eine stark sinnentstellende Kürzung darstellt.
Nein, tut es nicht. Vielleicht nur aus dem Blickwinkel eines C++ Programmierers, aber dann wärst du im falschen Forum. In C gibt es nunmal keine Referenzen wie in C++, deshalb ist es auch nicht falsch im Zeigerkontext von "referenzieren" zu sprechen. Selbst der Standard macht das.
-
groovemaster schrieb:
Daniel E. schrieb:
Wurde hier auch im Forum schon diverse Male falsch kolportiert (im Sinne von: int wird 'by value' übergeben, willst Du 'by reference' nimm int*), was zumindest eine stark sinnentstellende Kürzung darstellt.
Nein, tut es nicht. Vielleicht nur aus dem Blickwinkel eines C++ Programmierers, aber dann wärst du im falschen Forum. In C gibt es nunmal keine Referenzen wie in C++, deshalb ist es auch nicht falsch im Zeigerkontext von "referenzieren" zu sprechen. Selbst der Standard macht das.
Ähm, 'call by reference' ist ein programmiersprachenunabhängiger Ausdruck dafür, wie Parameter übergeben werden. Es hat nichts mit Referenzen als Sprachmittel oder dem Begriff referenzieren (was schlicht und ergreifend "bezug nehmen auf" oder zugreifen heißt; man reformiert nur nicht das Englische, weil es den Begriff 'call by reference' gibt) zu tun. Magst Du in diesem Licht deinen Beitrag nochmal erklären, ich kapiere ihn nämlich einfach nicht.
-
Was verstehst du denn nicht?
In C gibt es nunmal kein unabhängiges Sprachmittel wie in C++, eben Referenzen, um Parameter 'by-reference' zu übergeben. Alles was dir dort bleibt, sind halt Zeiger. Dass diese wiederum 'by-value' übergeben werden bzw auch andere Einsatzgebiete haben, tut dabei nichts zur Sache. Deshalb fand ich deine "sinnentstellende Kürzung" irgendwie fehlplatziert.
-
groovemaster schrieb:
In C gibt es nunmal kein unabhängiges Sprachmittel wie in C++, eben Referenzen, um Parameter 'by-reference' zu übergeben.
Stimmt auffallend, ich frage mich nur, warum Du ständig mit C++ daherkommst. Das hat hier nichts zu suchen.
Alles was dir dort bleibt, sind halt Zeiger. Dass diese wiederum 'by-value' übergeben werden bzw auch andere Einsatzgebiete haben, tut dabei nichts zur Sache.
Doch, darum geht's, 'call by <foobar>' ist ein technisches Konzept, und keine Frage, was ich damit machen kann. Sonst wäre auch
int a[1234] = { ... }; void manipuliere_a(int pos, int wert) { a[pos] = wert; }
'call by reference', weil im Prinzip funktionieren Zeiger genau *so*. Sie sagen eben 'schau da und da nach', also genau das, was hier pos macht. Das mag ein Verfahren sein, womit man Werte manipulieren kann -- mit 'call by reference' hat das mE nichts zu tun.
-
Daniel E. schrieb:
Doch, darum geht's, 'call by <foobar>' ist ein technisches Konzept, und keine Frage, was ich damit machen kann.
Wusste auch nicht, dass die jemand gestellt hat. Letztendlich ist die Frage, wie man sowas in C realisieren kann. Und warum ich da mit C++ komm. Nun, weil es dort eine nativere Möglichkeit gibt. War ja auch nur als Beispiel gedacht. Wenn dir das nicht gefällt, dann nimm halt irgendwas anderes, wie zB byref in VB.
Daniel E. schrieb:
int a[1234] = { ... }; void manipuliere_a(int pos, int wert) { a[pos] = wert; }
'call by reference', weil im Prinzip funktionieren Zeiger genau *so*. Sie sagen eben 'schau da und da nach', also genau das, was hier pos macht. Das mag ein Verfahren sein, womit man Werte manipulieren kann -- mit 'call by reference' hat das mE nichts zu tun.
Seh ich genauso. Bleibt nur die Frage, was dein Beispiel mit der Thematik zu tun hat. Ich sehe weder call 'by-reference', noch Zeiger, noch einen anderen Bezug.
Wobei immer noch die Erklärung zu "sinnentstellende Kürzung" offen bleibt.
-
groovemaster schrieb:
Daniel E. schrieb:
Doch, darum geht's, 'call by <foobar>' ist ein technisches Konzept, und keine Frage, was ich damit machen kann.
Wusste auch nicht, dass die jemand gestellt hat. Letztendlich ist die Frage, wie man sowas in C realisieren kann.
Nein. Die Frage war, ob C ein 'call by reference'-Konzept hat. Die Antwort darauf ist und bleibt nein.
Bleibt nur die Frage, was dein Beispiel mit der Thematik zu tun hat. Ich sehe weder call 'by-reference', noch Zeiger, noch einen anderen Bezug.
Das muß aber nicht an mir liegen.
Den Bezug zwischen meinem Beispiel und der 'call by reference'-Zeigerproblematik habe ich schon erklärt. Ein Zeiger sagt "gucke da und dort nach". Solche Informationen kann ich aber auch durch eine einfache int-Variable vermitteln, die offenbar als Wert übergeben und kopiert wird. Mich würde interessieren, wo Du den Unterschied siehst, zwischen dem obigen Beispiel und dem äquivalenten Zeigerquelltext. Ich sehe nämlich keinen, der so wesentlich wäre, daß man das eine als 'call by ref' und das andere als 'call by value' einordnen könnte.
Wobei immer noch die Erklärung zu "sinnentstellende Kürzung" offen bleibt.
C kennt kein 'call by reference'. Man kann Zeiger als Krücke verwenden, die für einen Anfänger so ähnlich aussehen wie ein 'call by reference'-Konzept, in Wirklichkeit aber nur eine recht primitive Gehhilfe sind. Also ist die Aussage "'call by reference' macht man in C durch Zeiger" eine sinnentstellende Verkürzung, auf eine der Implikationen der OP hereingefallen ist. Ich frage mich, was daran so kompliziert zu verstehen sein soll.
-
Daniel E. schrieb:
Die Frage war, ob C ein 'call by reference'-Konzept hat. Die Antwort darauf ist und bleibt nein.
Aso, das meinst du. Dann sag es doch gleich.
Keine Ahnung, ob C irgendwann mal mit dem Hintergedanken von Referenzparametern entwickelt wurde. Letztendlich bleibt es ein sprachunabhängiges Konzept, wie du schon sagst, völlig frei von der Umsetzung. Und wenn man in C halt Zeiger dafür benutzt, dann versteh ich nicht was daran "sinnentstellend" sein soll. Letztendlich werden in C++ Referenzen idR auch nur über Zeiger realisiert, nur etwas netter verpackt.Daniel E. schrieb:
Den Bezug zwischen meinem Beispiel und der 'call by reference'-Zeigerproblematik habe ich schon erklärt. Ein Zeiger sagt "gucke da und dort nach". Solche Informationen kann ich aber auch durch eine einfache int-Variable vermitteln, die offenbar als Wert übergeben und kopiert wird. Mich würde interessieren, wo Du den Unterschied siehst, zwischen dem obigen Beispiel und dem äquivalenten Zeigerquelltext. Ich sehe nämlich keinen, der so wesentlich wäre, daß man das eine als 'call by ref' und das andere als 'call by value' einordnen könnte.
Ist ja schön und gut, nur versteh ich immer noch nicht, worauf sich deine Argumentation bezieht. Was willst du mir damit sagen? Dass Referenzen keine Zeiger sein müssen? Hat ja auch niemand behauptet. Zeiger können aber durchaus für Referenzen benutzt werden.