Seite 1 von 1

Pointer

Verfasst: Mo Mär 14, 2011 4:41 pm
von canlot
In C wird viel mit Pointern gearbeitet.
Ich arbeite auch seit einiger Zeit mit ihnen.
Mir ist aber bisher aufgefallen das man Pointer mit Variablen ersetzen kann.
Kann jemand das gegenteil beweisen vielleicht ein Beispiel posten wo Pointer
unerlässlich sind.

Vielen Dank schon mal :D

Re: Pointer

Verfasst: Mo Mär 14, 2011 4:59 pm
von Xin
canlot hat geschrieben:Mir ist aber bisher aufgefallen das man Pointer mit Variablen ersetzen kann.
Kann jemand das gegenteil beweisen vielleicht ein Beispiel posten wo Pointer
unerlässlich sind.
Kannst Du mir kurz ein Beispiel zeigen, wo man Pointer durch Variablen ersetzen kann, damit ich diesen Gedankengang vielleicht nachvollziehen kann?

Re: Pointer

Verfasst: Mo Mär 14, 2011 5:02 pm
von cloidnerux
Du scheinst das Prinzip eines Pointers nicht verstanden zu haben.
Eine Variable ist einfach ein Stück Ram, das ist schon mit dem Compilieren fest im Programm und wird dann beim Start belegt.
Das heißt auch für dich, das eine Variable direkt und verbindlich im Speicher angelegt werden muss.
Ein Pointer ist auch eine Variable, nur speichert er keine Zahlen sondern Adressen, RAM-Adressen um genau zu sein.
Das bedeutet, das du mit einem Pointer(engl für ZEIGER) zum einen auf eine Stelle im Ram lesend und schreiben Zugreifen kannst, z.B das du ihn auf die Stelle einer bestimmten Variable zeigen lässt, oder du ihn auf freien Speicherbereich zeigen lassen kannst.
Damit ist das dynamische Programmieren erst möglich, denn wie willst du es schaffen, während des COMPILIERENS genau zu sagen, wie viel Speicherplatz du für einen langen Text brauchst, den der Nutzer eingibt? Willst du mal Vorsorglich 1GB an ram in Variablen Reservieren?
Nein, das will keiner, das wäre auch viel zu umständlich. Man kann Pointer nutzen. Man fragt per malloc das Betriebssystem, wo denn noch etwas Speicher frei ist, lässt einen Zeiger darauf verweisen und kann dann dort seine Daten Speichern und laden.

Damit ist die Koexsitenz von Pointer und Variable gegeben, und auch die Wichtigkeit von Pointern in Dynamischen Programmen oder Komplexen Datenstrukturen.

Re: Pointer

Verfasst: Mo Mär 14, 2011 5:32 pm
von canlot
Also sind Zeiger einfach nur dynamische Variablen?
Kannst Du mir kurz ein Beispiel zeigen, wo man Pointer durch Variablen ersetzen kann, damit ich diesen Gedankengang vielleicht nachvollziehen kann?
hier:

Code: Alles auswählen

/* ptr2.c */
#include <stdio.h>

#include <stdlib.h>

int main(void) {
   int abfrage;
   int Kapitel1 = 5;
   int Kapitel2 = 60;
   int Kapitel3 = 166;
   int Nachtrag = 233;
   int *Verzeichnis;   /* Zeiger */

   do {
      printf("\tINDEXREGISTER VOM BUCH\n");
      printf("\t*******************************\n\n");
      printf("\t-1- Kapitel 1\n");
      printf("\t-2- Kapitel 2\n");
      printf("\t-3- Kapitel 3\n");
      printf("\t-4- Nachtrag\n");
      printf("\t-5- Ende\n");
      printf("\n");
      printf("\tAuswahl : ");
      scanf("%d",&abfrage);
      printf("\tKapitel %d finden Sie auf ",abfrage);

      switch(abfrage) {
         case 1  :  Verzeichnis =& Kapitel1;
                    printf("Seite %d\n", *Verzeichnis);
                    break;
         case 2  :  Verzeichnis =& Kapitel2;
                    printf("Seite %d\n", *Verzeichnis);
                    break;
         case 3  :  Verzeichnis =& Kapitel3;
                    printf("Seite %d\n", *Verzeichnis);
                    break;
         case 4  :  Verzeichnis =& Nachtrag;
                    printf("Seite %d\n", *Verzeichnis);
                    break;
         default :  printf("Seite ???\n");
                    break;
      }
   } while(abfrage < 5);
   return EXIT_SUCCESS;
}
Achja - der Code ist nicht von mir

Re: Pointer

Verfasst: Mo Mär 14, 2011 5:38 pm
von Xin
Mit dem Beispiel kann ich nichts anfangen - da wird sinnfrei ein Zeiger eingebaut und den kann man genauso auch wieder entfernen.
canlot hat geschrieben:Also sind Zeiger einfach nur dynamische Variablen?
Nein.

Ein Zeiger ist eine Variable, wie ein Integer auch. Allerdings ist ein Integer-Zeiger kein Integer - er speichert also ganz andere Daten, nämlich die Information, wo der Integer, der mich gerade interessiert steht. Ein Zeiger löst ein anderes Problem als ein Integerwert, aber Variablen sind beides. Ersetzen kannst Du lediglich Gleichwertiges.

Re: Pointer

Verfasst: Mo Mär 14, 2011 5:39 pm
von cloidnerux
Also sind Zeiger einfach nur dynamische Variablen?
Falsch, ein Pointer ist eben KEINE Variable, es ist ein Zeiger.
Er hat halt nur wie eine Variable gemeinsam, das er auch im Speicher liegt und eine Zahl als Wert hat, aber ein Zeiger soll was ganz anderes machen.
Die 3 Operationen bei den printfs:

Code: Alles auswählen

int i = 0;
int *p = &i;

printf("%d", p);
printf("%d", &p);
printf("%d", *p);
Machen alle 3 was anderes, vor allem im Bezug mit Variablen.
Mit "p" rufst du den Wert, also die Adresse auf die der Pointer zeigt ab. Mit "&p" die Adresse des Pointers an sich und mit "*p" den Wert der Variable, auf die der Pointer zeigt.
Damit Ermöglichen Pointer erst dynamische Systeme, sie selbst sind aber KEINE Dynamischen Variablen.

Re: Pointer

Verfasst: Mo Mär 14, 2011 6:19 pm
von Xin
cloidnerux hat geschrieben:
Also sind Zeiger einfach nur dynamische Variablen?
Falsch, ein Pointer ist eben KEINE Variable, es ist ein Zeiger.
Vorsicht... auch Zeiger können genauso (in) Variablen sein, wie Daten. Auch Zeiger sind Daten, es ist "nur" ein semantischer Unterschied zwischen einem (int) und einem (int *).

Code: Alles auswählen

int value = 4711;
int value2 = 1234;
int * pInt = &value;  // Der Zeiger pInt zeigt auf die Variable (int) Value.
int ** ppInt = &pInt;  // Der Zeiger ppInt zeigt auf die Variable (int *) pInt

pInt = &value2;
*pInt = 4321;  // Dahin, wo pInt hinzeigt, wird 4321 geschrieben.
pInt ist eine Variable, sie zeigt mal auf value, mal auf value2. ppInt ist ebenfalls eine Variable und könnte geändert werden.
*pInt ändert value2, denn dort zeigt es hin. pInt selbst enthält aber kein Int. Zeiger enthalten keine Daten, sie zeigen nur dahin, wo die Daten zu finden sind. Und solch ein Datum kann auch wieder ein Zeiger sein.

Sowas geht nicht:

Code: Alles auswählen

int value = 4711;
int ** ppInt = &(&value);
&value ist eine Adresse, eine Adresse kann aber keine Adresse mehr haben, es ist ja schließlich schon eine. Vor & muss also eine Variable stehen, die im Speicher liegt. (&value) ist aber keine Variable im Speicher mehr, sondern nur eine Adresse. Speichert man diese Adresse aber wie zuvor in einer Variable pInt, so kann man mit &pInt wieder die Adresse der Variablen in ppInt speichern.