====== Aufgaben zu 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.
Beschreibe das Ergebnis der folgenden Anweisungen:
int j=10;
int* p=&j;
*p=17;
Memo1->Lines->Add(IntToStr(j));
Memo1->Lines->Add(IntToStr(*p));
Beschreibe das Ergebnis der folgenden Anweisungen:
int* f_retp()
{
int x=1;
return &x;
}
...
Memo1->Lines->Add(IntToStr(*f_retp()));
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);''\\
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.
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
#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));
}
//---------------------------------------------------------------------------