Problem mit Referenzen
-
Hallo,
ich möchte in einem C-Programm eine Variable x per Referenz an eine Funktion a übergeben. Die Funktion a soll diese Referenz dann an die Funktion b übergeben.
Die Frage ist nun wie der Funktionsaufruf für die Funktion b auszusehen hat. b(x) funktioniert leider nicht.Der Code sieht schematisch so aus:
int main { int x; a(&x); } void a(int* x) { b(???); } void b(int* x) {...}
Gruß
Hugh
-
HughJazz schrieb:
b(x)
ist genau richtig.
HughJazz schrieb:
funktioniert leider nicht.
ist keine ausreichende Fehlerbeschreibung.
-
b(&*x);
also die Adresse vom Ziel wird da nochmals übergeben. mit b(x); klappts aber auch, weil in b steht ja die Adresse
void b(int* x) { cout << *x; cin.get(); } void a(int* x) { b(x); } int main() { int x; x=4; a(&x); }
-
wow, das ging ja schnell
Also, wenn ich mir sowohl in main als auch in b Inhalt und Speicheradresse mit printf ausgeben lasse stimmen diese Werte nicht überein.
Falls es wichtig ist: die Software läuft und kompiliert unter Linux.
-
dawa85 schrieb:
b(&*x);
Hab ich auch schon versucht, führt zum selben Verhalten.
-
HughJazz schrieb:
wow, das ging ja schnell
Also, wenn ich mir sowohl in main als auch in b Inhalt und Speicheradresse mit printf ausgeben lasse stimmen diese Werte nicht überein.
Falls es wichtig ist: die Software läuft und kompiliert unter Linux.
in b um Speicheradresse auszugeben:
cout << b;in main um Speicheradresse auszugeben:
cout << &x
-
HughJazz schrieb:
Also, wenn ich mir sowohl in main als auch in b Inhalt und Speicheradresse mit printf ausgeben lasse stimmen diese Werte nicht überein.
Zeig doch mal Code. BTW die Dinger heißen Zeiger, nicht Referenzen.
-
HughJazz schrieb:
Also, wenn ich mir sowohl in main als auch in b Inhalt und Speicheradresse mit printf ausgeben lasse stimmen diese Werte nicht überein.
Du musst in b natürlich *x benutzen. Hast du das getan? Zeig doch mal den Code.
-
HughJazz schrieb:
wow, das ging ja schnell
Also, wenn ich mir sowohl in main als auch in b Inhalt und Speicheradresse mit printf ausgeben lasse stimmen diese Werte nicht überein.
Falls es wichtig ist: die Software läuft und kompiliert unter Linux.
in b um Speicheradresse auszugeben:
cout << x;in main um Speicheradresse auszugeben:
cout << &xweil in b ist der Inhalt von x die Speicheradresse von x in Main.
in main ist der Inhalt von x der entsprechende Wert. Wie in dem Beispiel unten z.B. 4void b(int* x) { cout << x << endl; } void a(int* x) { b(x); } int main() { int x; x=4; a(&x); cout << &x << endl; cin.get(); }
so bekommst du 2mal dieselbe Speicheradresse ausgegeben
-
Ich hab mich gerade mal aufklären lassen wieso das nicht gehen kann: Die beiden Funktionen laufen in unterschiedlichen Prozesse die untereinander mit messages kommunizieren. Jetzt wird das Ganze wohl doch ein bischen komplizierter...
Danke für eure Hilfe
-
ANSI C kennt Streams? Oha ...
#include <stdio.h> void foo(int* x) { printf(".foo: %p => %d", x, *x); bar(x); } void bar(int* x) { printf(".bar: %p => %d", x, *x); } int main() { int x = 4; printf(".main: %p => %d", &x, x); foo(&x); getchar(); }
...
-
Ich glaube in der Überschrift gelesen zu haben "Problem mit Referenzen"
int* ist aber ein Pointer keine Referenz
int& ist die Referenz
Alsovoid b(int& x) { cout << x; cin.get(); } void a(int& x) { b(x); } int main() { int x; x=4; a(x); }
-
Nur das es in AnsiC keine Referenzen gibt.
-
Braunstein schrieb:
Nur das es in AnsiC keine Referenzen gibt.
C kennt keine 'reference types' im sinne von C#, Java o.ä. in C nimmt man eben pointer dafür. der wichtigste unterschied ist ja nur, dass bei referenzen mit verweisen auf objekte gearbeitet wird, während bei 'by value' das objekt selber kopiert wird.
int a; ... f (a); // call 'by value', das objekt selbst wird kopiert g (&a); // call 'by reference', es wird ein verweis auf das objekt übergeben
-
Und bei g() übergibst du ein Objekt "by value" vom Typ T*.
-
Tim schrieb:
Und bei g() übergibst du ein Objekt "by value" vom Typ T*.
ja, das ist aber technisch bedingt. die referenz bzw. der pointer wird 'bei value' übergeben. es ändert aber nichts an der referenzsemantik, die dahinter steckt.
-
Es geht hier auch mehr um Terminologie als um Semantik.
Edit: Aber ich erwarte nicht (mehr), dass du das verstehst.
-
Tim schrieb:
Es geht hier auch mehr um Terminologie als um Semantik.
ist doch kein problem:
ISO/IEC 9899:1999 schrieb:
A pointer type describes an object whose value
provides a reference to an entity of the referenced type.
-
Also findest du auch das "call by reference" von dem du hier immer redest?
-
Tim schrieb:
Also findest du auch das "call by reference" von dem du hier immer redest?
wo? im C-standard? nein, aber wieso sollte 'call by reference' dort ausdrücklich erwähnt sein? wenn referenzsemantik in C mit pointern ermöglicht wird, sollten damit auch 'calls' gehen. ich weiss gar nicht, warum du damit solche schwierigleiten hast, oder meinst du den 'referenzbegriff' haben pointerlose programmiersprachen für sich gepachtet?