mikrocontroller.net

Forum: Compiler & IDEs Zeiger auf Struktur im Kernighan/Ritchie


Autor: mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich hab in der zweiten deutschen Ausgabe des Kernighan/Ritchie 
"Programmieren in C" etwas gefunden, dass ich nicht nachvollziehen kann. 
Für diejenigen die diese B uch auch haben gebe ich die Quellenangabe mit 
an.

zum Einen steht dort
[6.2 Strukturen und Funktionen, Seite 126]
struct point origin, *pp
pp = &origin;

zum Anderen steht dort
[6.2 Strukturen und Funktionen, Seite 127]
struct rect r,*rp=r;

Es soll jeweils eine Struktur und ein Zeiger auf die selbe Struktur 
definiert werden und danach der Zeiger mit der Sruktur initialisiert 
werden.
Das erste Bsp. kann ich nachvollziehen, da wird die Adresse der Struktur 
in den Zeiger geladen.

Wird beim zweiten Bsp. auch die Adresse der Structur in den Zeiger 
geladen? Wenn ja, würde es ja bedeuten dass folgende Zuweisungen das 
identische machen,
pp = origin;
pp = &origin;

UND DASS KANN KANN ICH MIR NICHT VORSTELLEN!

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
(Nur meinen Meinung)

orgin und pp stehen nach der Zuweisung auf der selber Adresse, was du in 
einem änderst siehst du im anderen (& steht ja für die Adresse)

r und rp haben "nur" den selben Inhalt (also ein Kopie), stehen also auf 
unterschiedlichen Adressen (* steht ja für den Inhalt)

Aber ich meine C kann nicht einfach so structs kopieren...

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mikes schrieb:
> Hallo,
> ...
> zum Einen steht dort
> [6.2 Strukturen und Funktionen, Seite 126]
>
> struct point origin, *pp
> pp = &origin;
> 

Hier fehlt ein Semikolon, aber egal.

>
> zum Anderen steht dort
> [6.2 Strukturen und Funktionen, Seite 127]
>
> struct rect r,*rp=r;
> 


Das ist schlicht und ergreifend falsch.
Es müsste &r heißen.


> ...
> Wird beim zweiten Bsp. auch die Adresse der Structur in den Zeiger
> geladen? Wenn ja, würde es ja bedeuten dass folgende Zuweisungen das
> identische machen,
>
> pp = origin;
> pp = &origin;
> 
>
> UND DASS KANN KANN ICH MIR NICHT VORSTELLEN!

Ich mir auch nicht, der gcc ebenfalls nicht und K&R inzwischen wohl
auch nicht mehr.

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... ... schrieb:
> (Nur meinen Meinung)
>
> orgin und pp stehen nach der Zuweisung auf der selber Adresse, was du in
> einem änderst siehst du im anderen (& steht ja für die Adresse)

falsch.
Es sind zwei Variablen, die jeweils an einer anderen Stelle stehen.

>
> r und rp haben "nur" den selben Inhalt (also ein Kopie), stehen also auf
> unterschiedlichen Adressen (* steht ja für den Inhalt)

falsch.
'*' steht für Zeiger in einer Deklaration.

>
> Aber ich meine C kann nicht einfach so structs kopieren...

falsch.
C kann prima structs kopieren.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
struct S {
  int a;
  char b;
};

int main() {
  struct S s1, *s2 = s1;

  return 0;
}
haku@haku-laptop[~/test] $ gcc -c test.c
test.c: In Funktion »main«:
test.c:8: Fehler: inkompatible Typen in Initialisierung

Autor: mikes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Hier fehlt ein Semikolon, aber egal.
Ja, ja, man sagt mir nach ich bin ein Schussel. Aber zum Glück merkts 
der Compiler im Gegensatz zum Problem in der Frage.

>Das ist schlicht und ergreifend falsch.
>Es müsste &r heißen

genau das wollte ich hören, wollte aber nicht aus fundiertem Halbwissen 
heraus die "Bibel" in Frage stellen.

Danke.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klaus Wachtler schrieb:
> ... ... schrieb:
>> (Nur meinen Meinung)
>>
>> orgin und pp stehen nach der Zuweisung auf der selber Adresse, was du in
>> einem änderst siehst du im anderen (& steht ja für die Adresse)
>
> falsch.
> Es sind zwei Variablen, die jeweils an einer anderen Stelle stehen.

Ich glaub wir meine das selbe...

Ich meinte damit das beide Var. den gleichen Inhalt haben oder ist das 
nicht so?

http://de.wikibooks.org/wiki/C-Programmierung:_Zeiger

Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Variablen sind origin und pp.
Die haben aber nicht den gleichen Inhalt.
origin und *pp haben den gleichen Inhalt, aber *pp ist keine
Variable, sondern ein Ausdruck.

Vielleicht pingelig, aber alles andere hilft hier nicht.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
>
> haku@haku-laptop[~/test] $ gcc -c test.c
> test.c: In Funktion »main«:
> test.c:8: Fehler: inkompatible Typen in Initialisierung
> 

Hehe, deutsche Fehlermeldungen. Wirkt gerade irgendwie komisch auf mich 
;)

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tja, vorallem deutsch und lesbar und verständlich. Sag das mal dem 
Visual-C++-Compiler >_>

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven P. schrieb:
> Tja, vorallem deutsch und lesbar und verständlich. Sag das mal dem
> Visual-C++-Compiler >_>

Sag ich ihm jedes mal. Hab ja selbst Visual C++ Express 2008...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.