zeiger vs arrays



  • Hi,

    Folgender Code angenommen:

    #include <stdio.h>
    
    int main(void){
    	char *name="Peter";
    	printf("%p\n",name);
    	name="Gerda";
    	printf("%p\n",name);
    	name="Alexander";
    	printf("%p\n",name);
    	return 0;
    }
    

    Das gibt dann sowas aus:
    00401310
    0040131A
    00401320
    interpretiere ich das richtig?:
    Sobald ich einen name einen neuen String zuweise, wird eine andere Position im Speicher verwendet, egal ob überschreiben gepasst hätte oder nicht?

    Was ist eigentlich ein Array im technischen Sinne? Im Zusammenhang mit Zeiger Arithmetik, macht es mir den Eindruck als wären Zeiger und Arrays irgendwie verwandt.
    Und tatsächlich funktioniert soetwas wie:

    #include <stdio.h>
    
    int main(void){
    	char name[]="Peter";
    	char *bla=name;
    	printf("%s\n",bla);
    	return 0;
    }
    

    Das gibt Peter aus. Aber dann ist es doch seltsam(für meine Begriffe), dass soetwas wiederum nicht geht:

    #include <stdio.h>
    
    int main(void){
    	char name[]="Peter";
    	printf("%p\n",name);
    	name="Gerda";
    	printf("%p\n",name);
    	name="Alexander";
    	printf("%p\n",name);
    	return 0;
    }
    

    Da mosert der Kompiler nämlich, bei der Zuweisung name="Gerda" und name="Alexander", dass das inkompatible Typen wären.
    Und das alles, obwohlein Array tatsächlich nur ein zeiger auf das erste Element ist, was ich aus der Ausgabe des folgenden Codes schließe:

    #include <stdio.h>
    
    int main(void){
    	char name[]="Peter";
    	char *pname=&name[0];
    	printf("%p\n",pname);
    	printf("%p\n",name);
    	printf("%c\n",*pname);
    	printf("%c\n",*name);	
    	return 0;
    }
    

    Das gibt nämlich dies hier aus:
    0022FF78
    0022FF78
    P
    P

    Das letzte Beispiel würde ja darauf hindeuten, dass ein Array und ein Pointer absolut gleich sind, aber die obigen widerlegen das eigentlich.
    Würde mir jemand den Unterschied klar machen? Offenbar existiert ja einer, weil man sie ja doch nicht gleich verwenden kann.

    Grüße
    Trollo



  • Der Unterschied ist, dass ein Array kein L-Value sein kann.

    greetz, Swordfish



  • das musste dir ungefähr so vorstellen: ein pointer ist einfach nur eine variable, die aber speziell dafür da ist, adressen zu speichern. ein array ist ein verbund von variablen gleichen typs. wenn du schreibst:

    char *p = "hallo";
    

    dann legst du einen pointer (p) an, der auf die zeichenkette "hallo" zeigt. die zeichenkette "hallo" wird in einem schreibgeschützten speicherbereich angelegt und ist demzufolge nicht veränderbar. dem pointer (p) kannst du aber danach sehr wohl die adressen anderer zeichenketten zuweisen:

    char *p = "hallo";
    p = "tinkywinky";
    

    ^^ hierbei werden zwei strings im schreibgeschützten speicher platziert. in der ersten zeile wird der pointer definiert und es wird ihm die adresse des ersten strings zugewiesen. in der zweiten zeile wird dem gleichen pointer die adresse eines anderen strings zugewiesen, wobei sein vorheriger inhalt überschrieben wird. auf die strings selbst hat dieser vorgang aber keinen einflusss. sie werden weder überschrieben noch verschoben noch sonstwas. bei arrays sieht die syntax so ähnlich aus, aber es spielt sich was gänzlich anderes ab.

    char a[] = "hallo";
    

    ^^ es wird ein array definiert und dieses array wird mit allen zeichen von "hallo" gefüllt plus einer 0 am ende. das array hat somit 6 elemente. der string "hallo" wird dabei nur zur initialisierung des arrays verwendet nicht nochmal irgendwo gespeichert. sowas funktioniert übrigens nur bei der initialisierung von arrays. ein späterer versuch:

    char a[] = "hallo"; 
    a = "tinkywinky";
    

    wird scheitern (wie du schon beobachtet hast). um ein array im nachhinein neu zu befüllen, müssen die elemente einzeln verändert werden. dazu gibt es funktionen wie z.b. strcpy(), memcpy() usw.
    🙂


Anmelden zum Antworten