Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Komische Sache mit einem Array und seiner Adresse

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
22.11.2007, 21:02 Uhr
RedEagle



Hi
Ich studiere im ersten Semester ET. Da wird momentan in Informatik nur mir bekannte themen durchnehmen, wollte ich mal gucken, was denn so im 2. Semester kommt.
So habe ich mir ein Übungsblatt für das 2. Semenster runtergeladen und angesehen.

Soweit "leider" auch kein Problem, aber eine Sache kommt mir sehr komisch vor:

Es ist folgende Funktion gegeben:

C++:
void funktion()
{
char S[256];
/* (1) */scanf("%s", S);
/* (2) */scanf("%s", &S);
/* (3) */scanf("%s", &S[0]);

//...
}


Es soll erklärt werden warum (1) bis (3) identisch ist.
gut, dass (1) gleich (3) ist, ist offensichtlich, aber warum (2)??

Wieso ist S==&S ?? (ich habe es ausprobiert, und es stimmt) (gcc 4.1.0 unter Linux x86-64)

S enthält doch eigentlich nur die Adresse, an der das Array liegt...
&S müsste doch eine andere adresse haben,
&S = S-4

Code:
Adresse    Wert       Kommentar
0x00000000 0x04000000 S    S enthält die adresse des 256 Arrays
0x00000004 0x00       S[0]
0x00000005 0x00       S[1]

(&S == 0x00000000)

Wo liegt mein Denkfehler??
Oder liege ich richtig??
--
MFG RedEagle

Dieser Post wurde am 22.11.2007 um 21:03 Uhr von RedEagle editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
23.11.2007, 01:02 Uhr
Pablo
Supertux
(Operator)



Zitat:

S enthält doch eigentlich nur die Adresse, an der das Array liegt...



richtig


Zitat:

&S müsste doch eine andere adresse haben,



nein, das ist einer der Unterschiede mit den Zeigern. Ein Zeiger speichert nur eine Adresse, S ist kein Zeiger sondern ein Array, d.h. irgendwo im Speicher sind 256 Bytes für das Array reserviert. Das Arrays (somit S und &S) liegt (liegen) genau am Anfang dieser reservierten 256 Bytes.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 23.11.2007 um 01:03 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
23.11.2007, 01:39 Uhr
0xdeadbeef
Gott
(Operator)


Das ist...so...nicht ganz korrekt.

Mann, ich habe darauf gewartet, das sagen zu können.

Also, der Unterschied ist, S selbst bezeichnet das ganze Array. Das zeigt sich zum Beispiel, wenn man sizeof(S) betrachtet (hier 256). Das Array ist allerdings implizit in einen Zeiger konvertibel, und das ist es, was hier passiert. &S als die Adresse des Arrays ist ein char(*)[256], &S[0] ein char*. Das zeigt sich zum Beispiel hier:

C++:
#include <stdio.h>

int main(void) {
  char s[256];

  printf("%d\n", sizeof(s));
  printf("%d\n", sizeof(*(&s)));
  printf("%d\n", sizeof(*(&s[0])));

  return 0;
}


...was die Ausgabe

Code:
256
256
1


ergibt.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
23.11.2007, 07:45 Uhr
RedEagle



Ich habe S immer als Zeiger auf 256-Byte Speicher betrachtet und da es von (!)mehreren Lehrern ebenfalls getan wurde, bin ich davon ausgegangen dass es stimmt...

Manchmal frage ich mich wirklich, ob mir in anderen Fächern, in denen ich auf das Wissen des Lehrers angewiesen bin, auch so viel Mist erzählt wird...

jedenfalls Danke für die Antworten
--
MFG RedEagle
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
23.11.2007, 11:40 Uhr
ao

(Operator)


Die alte Mär, dass Zeiger und Arrays dasselbe sind. Hält sich hartnäckig unter Leuten, die immer dieselben praxisfernen Lehrbeispiele durchkauen: a[i] vergleichen mit *(p+i), T a[] in Funktionen reingereicht wird zu T*p, T a[] zurückgeben geht nicht, T * a dagegen schon und so weiter. Das einzige, was bei so nutzlosem Kram hängenbleibt, ist "Zeiger == Array".

Würde im Info-Unterricht mal ein richtiges Programmierprojekt durchgezogen und nicht nur dieser immer gleiche Kinderkram gemacht, dann würden die Beteiligten auch die feinen Unterschiede merken.

Sollte hier ein Info-Lehrer mitlesen: Ihr unterrichtet ein *praktisches* Fach, ihr seid viel näher an Sport-, Kunst- oder Werkunterricht als an Physik und Mathe. Also nehmt auch praxistaugliche Übungen!

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
23.11.2007, 12:44 Uhr
Pablo
Supertux
(Operator)


@beefy: schön erklärt. Hab meinen Fehler gesehen (zumindest denke ich), aber es ging schon mal in die Richtung
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: