007
06.10.2002, 15:56 Uhr
fry_
|
Hallo Toby
Zitat: |
Ich dachte, erst dieses "*" vor dem Variablennamen macht das ganze zum Pointer
|
Nein, NUR wenn auch noch vor dem '*' wiederum ein Datentyp steht -> int* a_ptr
Diese verkürzte Schreibweise in Deinem Beispiel hat Dich vielleicht verwirrt: int a=5,* a_ptr;
Sowohl 'a' wie auch '*a_ptr' benutzen den einen Datentyp 'int'. Man beachte das ',' nach der 5.
Eigentlich steht dort: int a=5; int* a_ptr; <- Man beachte das ';' nach der 5.
Beide Schreibweisen sind völlig korrekt u. haben ein u. dieselbe Bedeutung.
WICHTIG: Die beiden folgenden '*' haben zwei ganz unterschiedliche Bedeutungen. '*' Variante 1: int* a_ptr <- Durch diesen '*' (MIT Datentyp davor -> 'int*') erstelle ich mir den Pointer vom Typ Integer a_ptr <- so wie er jetzt in dieser Codezeile dasteht, ist er ein Pointer vom Typ Integer, den ich in der Codezeile darüber erstellt habe.
a_ptr = &a; // Pointer a_ptr bekommt die Adresse von a zugewiesen.
'*' Variante 2: (betrachte es als Hilfsmittel für Pointer) *a_ptr <- Mit diesem '*' (hier OHNE Datentyp davor -> '*') würde ich den Inhalt der variable bekommen, worauf der Pointer 'a_ptr' zeigt(also den Inhalt von a)
Fazit: Variante 2 klappt nur, wenn a_ptr bereits ein Pointer IST! Ich erstelle mir somit kein Pointer!
Zitat: |
aber dann habe ich also immer noch nicht verstanden, warum man vor dem Pointer auf strings [siehe Bsp oben: printf("das wort war: %s\n",wort);] keinen "*" davor setzen soll und zum gegensatz bei pointern auf integervariablen muss man das "*" setzen
|
Das liegt an der Sonderstellung von Strings:
Merke Dir doch einfach, sobald man den Inhalt von variablen mit '%s' ausgeben kann, benötigt man kein '*'. Wie: Strings -> "char* ch="Hallo";
Möglich ist aber auch: (sieht aber nicht schön aus) Zeichenkette vom Typ char -> char ch={'H','a','l','l','o'};
Zwei Beispiele:
C++: |
#include <stdio.h> // möglich wäre auch #include <cstdio> // falls du das mal siehst
int main() {
// ARRAY UND POINTER int ix; // Laufindex für die while-Schleifen int i[10]; // array mit Index 0-9 int* pi; // Zeiger vom Typ Integer
// array i wird mit Werten gefüllt -> 95-86 for (ix=0; ix<10; ++ix) i[ix]=95-ix;
pi = &i[0]; // übergib die Adresse des ersten Elements im // array i (auch Startadresse) // verkürzte Schreibweise: pi = i;
//[1] printf("[1]\n"); printf("%p\n",pi); // die Adresse des ersten Elements im // array i
//[2] printf("[2]\n"); printf("%i\n",*pi); // der Inhalt des ersten Elements worauf // pi zeigt
//[3] printf("[3]\n"); // gibt über den Pointer pi alle Adressen im array i aus while(pi!=&i[10]) { // bis er auf die Adresse nach der letzten // Adresse vom array i trifft printf("%p\n",pi++); // übergibt erst seinen Inhalt(eine // Adresse) u. geht dann eine Adresse im // array i weiter }
// So am Rande -> Achte mal auf die Adressen: // In meinem Bsp: // 0012FF54 // 0012FF58 +4 // 0012FF5C +4 // ... // Bei mir ist Integer 4 Byte(32Bits) groß, also liegen alle 4 // Stellen auseinander // -> 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F
pi = &i[0]; // setzt pi wieder auf die Startadresse vom array i
//[4] printf("[4]\n"); // gibt über den Pointer pi den Inahlt aller Elemente im array // i aus while(pi!=&i[10]) { printf("%i\n",*pi++); } // Übergibt erst seinen Inhalt des Elements, worauf pi zeigt u. // geht dann eine Adresse im array i weiter(++). // ++ hat eine größere Bindungskraft als * -> daher benötigt // man nicht *(pi++) möchtest du aber den Inhalt um 1 erhöhen, // warauf pi zeigt -> (*pi)++ ;-)
/* // STRING UND POINTER int ix; // Laufindex für die while-schleife char s[10]; // array mit Index 0-9 char* ps; // Zeiger vom Typ char
// füllt den array ch mit Zeichen for (ix=0; ix<10; ++ix) s[ix]=97+ix; // fängt im Ascii-code bei 'a' an
// Das letzte Element bekommt die Endkennung '\0' s[9]='\0'; // Macht aus dem array s einen string
ps = &s[0]; // übergibt die Startadresse im string s
//[1] printf("[1]\n"); printf("%p\n",ps); // zeigt den Inhalt des Pointers ps an //(Startadresse von s)
//[2] printf("[2]\n"); printf("%c\n",*ps); // gibt den Inhalt des ersten Elements im // string aus
// Gibt alle Adressen über den Pointer ps im string s aus
while(ps!=&s[9]) { // bis er auf Endkennung '\0' trifft printf("%p\n",ps++);// gibt erst den Inhalt von ps(eine //Adresse) an printf u. geht dann //eine Adresse im string s weiter(++). }
// Bei mir: // 0012FF70 // 0012FF71 +1 // 0012FF72 +1 // ... // char ist nur 1 Byte(8Bits) groß, also liegen alle Elemente //eine Stellen auseinander
ps = &s[0]; // setzte ps wieder auf die Startadresse vom // string s
//[3] printf("[3]\n"); // Wichtig: hier benötige ich keine Schleife mehr, um den // Inhalt aller Elemente im // string s über den Pointer ps auszugeben.
printf("%s\n",ps); // durch das %s weiß printf, dass es, // beginnend bei der Adresse, die // von ps übergeben wird, den Inhalt aller // Elemente ausgeben soll.
//[4] printf("[4]\n"); // Du kannst es aber auch mit Hilfe einer Schleife ausgeben // (dann aber mit '*') // Gibt alle Zeichen über den Pointer ps vom string s aus while(ps!=&s[9]) { printf("%c\n",*(ps++)); // printf bekommt ein Zeichen //(%c) u. kein ganzen string (%s) }*/
return 0; }
|
Frag' einfach noch mal, wenn etwas unklar ist.
Gruß -- mit computern geht alles viel schneller es dauert nur ein bisschen länger Dieser Post wurde am 06.10.2002 um 16:07 Uhr von fry_ editiert. |