Aufgaben zu Zeigern

Aufgabe 0: Verständnisübung mit Zeigern

Gib an, welche Ausgaben am Bildschirm erscheinen, ohne dass du das Programm laufen lässt.

#include <iostream>         //Zusatzbibliothek für Ein- und Ausgaben
#include <conio.h>          //Zusatzbibliothek für Konsole
using namespace std;        //Standart-Namensraum wird eingestellt
 
int main(int argc, char** argv) {
 
char *x, *y, *z;
char u;
 
 x = new char;
 z = new char;
 y = z;
 *x = 'A';
 *y = 'B';
 
  cout << *x << endl;
  cout << *y << endl;
  cout << *z << endl;
 
  u = 'C';
  y = &u;
 *z = 'D';
 
  cout << u << endl;
  cout << *y << endl;
 
  u = 'E';
  y = x;
  x = z;
  z = &u;
 *y = 'N';
 
  cout << u << endl;
  cout << *y << endl;
  cout << *x << endl;
  cout << *z << endl;
	return 0;
}

Aufgabe 1: Verständnisübung mit Zeigern

Nach den Definitionen
  int i=5;
  int *pi, pj;
  int *pc, pd;

sollen die folgenden Zuweisungen in einem Programm stehen:

  pi=i; 
  pi=&i;
  *pi=i;
  *pi=&i;
  pi=pj;
  pc=&pd;
  pi=pc;
  pd=*pi;
  *pi=i**pc;
  pi=0;

Gib an, welche dieser Zuweisungen syntaktisch korrekt sind. Gib außerdem für jeden syntaktisch korrekten Ausdruck den Wert der linken Seite an, wobei die Ergebnisse der zuvor ausgeführten Anweisungen vorausgesetzt werden sollen. Falls die linke Seite ein Zeiger ist, gib den Wert der dereferenzierten Variablen an.

Aufgabe 2: Verständnisübung mit Zeigern

Beschreibe das Ergebnis der folgenden Anweisungen:

  int j=10;
  int* p=&j;
  *p=17;
  Memo1->Lines->Add(IntToStr(j));
  Memo1->Lines->Add(IntToStr(*p));

Aufgabe 3: Verständnisübung mit Zeigern

Beschreibe das Ergebnis der folgenden Anweisungen:

  int* f_retp()
  {
  int x=1;
  return &x;
  }  
...
 
  Memo1->Lines->Add(IntToStr(*f_retp()));

Aufgabe 4: Verständnisübung mit Zeigern

Beschreibe für die Funktion

int f(int a, bool b, bool c, bool d)
{
  int* p; int* q; int x=0;
  if (a==1) { p=0; q=0; }
  else if (a==2) { p=new int(17); q=new int(18); }
  else if (a==3) { p=&x; q=&x; }
  if (b) p=q;
  if (c) x=*p+*q;
  if (d) { delete p; delete q; }
  return x;
}

das Ergebnis der Aufrufe:

a) f(0,false,true,true);
b) f(1,false,false,true);
c) f(2,false,true,false);
d) f(2,true,true,true);
e) f(3,true,true,true);
f) f(3,true,true,false);

Aufgabe 5: Verständnisübungen mit Zeigern

Erstelle zwei Zeiger pAS1 und pAS2 auf zwei AnsiStrings.
a) Belege die beiden Speicherplätzen, auf die die beiden Zeiger zielen, jeweils einen kurzen Text zu und gib diesen aus.
b) Führe die Zuweisung pAS2=pAS1; aus und erkläre mit einer Graphik, warum nun beide Ausgaben den gleichen Text liefern.
c) Führe die Zuweisung pAS2=pAS1; aus, gib *pAS2 aus, verändere den Text auf den pAS2 zeigt und gib dann *pAS1 aus. Erkläre wieder mit einer Graphik was hier geschieht.
d) Deklariere zwei Variablen AS1,AS2 und weise ihnen einen Text zu. Deklariere zwei weitere Pointervariablen pAS3,pAS4 und lasse sie (mittels Adressoperator) auf jene Speicherbereiche zeigen, die durch die Variablen AS1 und AS2 besetzt werden.
e) Lasse den Zeiger pAS1 auf den Speicherinhalt von *pAS2 und den Zeiger pAS2 auf den Speicherinhalt von *pAS1 zeigen.
f) Lasse einen der beiden Zeige auf die definierte Leerstelle (NULL) zeigen und versuche auszugeben, wohin beide Zeiger zielen.

Aufgabe 6: Verständnisübung mit Zeigern

a) Erkläre, an welcher Stelle und warum das folgende Programm (erst während der Laufzeit) einen Fehler meldet.
b) Verändere das Programm so, dass der Inhalt beider Speicherstellen (auf die die beiden Zeiger zielen) ausgegeben wird.
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Pointer1Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm2 *Form2;
int *pi1, *pi2;
//---------------------------------------------------------------------------
__fastcall TForm2::TForm2(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm2::Button1Click(TObject *Sender)
{
 int zahl1=13,zahl2=17;
 pi1=&zahl1;
 *pi2=zahl2;
 Memo1->Lines->Add("Inhalt des Speicherpatzes auf den pi1 zeigt: "+IntToStr(*pi1));
 Memo1->Lines->Add("Inhalt des Speicherpatzes auf den pi2 zeigt: "+IntToStr(*pi2));
}
//---------------------------------------------------------------------------