PS-Trainer C - Entwicklung
Lehreinheit Nr. 2
Homepage von PS-Trainer - C-Entwicklung - Bibliotheken - an PS-Trainer
PS-Trainer PS-Trainer

001 Pointers - Integer
002 Pointers - Integer Array
003 Pointers - Strings
004 Aufgabe "Pointertest Float 1"
005 Aufgabe "Pointertest Float 2"
006 Aufgabe "Stringtest 1"
007 Aufgabe "Stringtest 2"

001
Pointers - Integer

Dieses Beispiel zeigt Pointers am Beispiel von Ganzzahlen (Integers):

Bei der Definition globaler Funktionen (Prototypen) finden sie den Pointer *pm als Argument der Funktion subb. Im Hauptprogramm main wird ein weiterer pointer *pm definiert: Pointer sind nicht einfach ganzzahlige Adressen, sie (müssen) auch wissen, von welcher Type die Daten sind, auf welche sie zeigen. Nur dadurch ist es z.B. möglich, unabhängig von der Größe der Daten (1byte, 2byte, 4byte...) mit einem Increment p++ auf das jeweils nächste Element der Daten zu zeigen.

Im Hauptprogramm main wird zunächst ein pointer auf eine Adresse gesetzt - Das ist die Voraussetzung, nachfolgend mit diesem pointer zu arbeiten. Dann wird gezeigt, wie sie den Wert von Variablen wahlweise konventionell oder mit einem Pointer setzen.

Dann wird eine Variable an das Unterprogramm suba übergeben. Sie sehen, dass nur eine "Moment-Kopie" des Wertes dieser Variablen an suba übergeben wird. Suba kann die entsprechende Variable verwenden und ändern, ohne Rückwirkung auf das Hauptprogramm.

Es folgt die Pointer-Variante: Ein Pointer wird an das Unterprogramm subb übergeben. Hier wird ebenso nur eine Kopie des Wertes dieses Pointers übergeben, aber nun hat das Unterprogramm subb über den Pointer tatsächlich Zugriff auf die Variable: Eine Änderung wirkt sich auf das Hauptprogramm aus, und zwar ohne, daß der geänderte Wert (z.B. mit return) übergeben wurde !

Beispiel:
/*
Program to demonstrate pointers (integers)
Version 1.0 / 2001.09.01.
Peter Schindler pstrainer@gmx.net
*/

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* Declaration of globals ***********************************/
void suba (int m);
void subb (int *pm); // *pm is a pointer to int

/* Main program *********************************************/
void main (void){
int i,j,k; // integer variables
int *pi; // pointer to int variable

printf("Pointer Test Program\n");
printf("Enter integer number: ");
scanf("%d",&i);
printf("\n");

// set pointer pi to the address of i ("let it point at i")
pi=&i;

/* assign other variables in different ways */
j=i; // set j to value of i
k=*pi; // set k to value of whatever pi points at

/* send VALUE to subroutine */
printf("main01 i=%d j=%d k=%d pi=%d\n",i,j,k,pi);
suba(i); // i remains unchanged
printf("main02 i=%d j=%d k=%d pi=%d\n\n",i,j,k,pi);

/* send POINTER to subroutine */
printf("main03 i=%d j=%d k=%d pi=%d\n",i,j,k,pi);
subb(pi); // i can be changed
printf("main04 i=%d j=%d k=%d pi=%d\n\n",i,j,k,pi);

printf("End of program\n");
_getch();
}

/* suba: get integer value and change it *******************
You may change local variable, without effect to main */
void suba (int m) {
int n;
n=m;
printf("suba01 m=%d n=%d\n",m,n);
m++; /* change local variable */
printf("suba02 m=%d n=%d\n",m,n);
}

/* suba: get pointer value, change value *******************
You may change local variable but also main ! */
void subb (int *pm) {
int m,n;
m=*pm; /* set m to whatever pm points at */
n=m;
printf("subb01 m=%d n=%d pm=%d\n",m,n,pm);
m++; /* change local variable */
*pm=m; /* set whatever pm points at to m */
printf("subb02 m=%d n=%d pm=%d\n",m,n,pm);
}

/* eof ******************************************************/


002
Pointers - Integer Array

Dieses Beispiel ist nur eine kleine Variation des Programms Nr. 1 (Integer pointer):
Hier wird an Stelle einer int Variablen ein int array (Feld) eingesetzt.

Zuerst wird das array initialisiert. Das muß nicht sein, hat aber den Vorteil, daß sie bei einem genau definierten Anfangs-Zustand jede Änderung leichter erkennen können. Sie sehen bereits, daß die Verwendung von arrays üblicherweise das Arbeiten mit Schleifen (loops) mit sich zieht.

Um einen Pointer auf die Adresse eines arrays zu setzen, setzen sie ihn auf die Adresse des ersten Elements [0]. Das ist äquivalent damit, den Pointer direkt auf den Namen des arrays zu setzen. Sie sehen: arrays und pointers sind eng verwandt, eher verschiedene Ausdrucks-Formen der gleichen Objekte.

Nun wird das array (Syntax wie eine Variable) an das Unterprogramm suba übergeben. Jeweils vorher und nachher werden die ersten Elemente des arrays zur Kontrolle ausgedruckt. Sie sehen, daß in diesem Fall die Elemente durch das Unterprogramm geändert werden können ! - Das array verhält sich genauso wie vorher der Pointer auf die int Variable.

Zuletzt wird der Pointer auf das array an Unterprogramm subb übergeben: Dieses verhält sich genauso und kann ebenfalls Werte ändern. Sie sehen bestätigt: arrays und pointers sind nur unterschiedliche Ausdrucksformen der gleichen Objekte.

/*
Program to demonstrate pointers (int array)
Version 1.0 / 2001.09.01.
Peter Schindler pstrainer@gmx.net
*/
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* Declaration of globals *****************************/
void suba (int ix[]);
void subb (int *px);

/* Main program *************************************/
void main (void){
int i,ia[100];
int *pia;

printf("Pointer Test Program\n\n");
// init array ai
for (i=0;i<100;i++) {ia[i]=i*2;}
// set pointer pia to the address of ia
pia=&ia[0];

// send array (pointer!) to subroutine
printf("main01"); // print elements
for (i=0;i<8;i++) {printf("%5d",ia[i]);}
printf("\n");

suba(ia);

printf("main02"); // print elements
for (i=0;i<8;i++) {printf("%5d",ia[i]);}
printf("\n\n");

// send pointer to subroutine
printf("main03"); // print elements
for (i=0;i<8;i++) {printf("%5d",ia[i]);}
printf("\n");

subb(pia);

printf("main04"); // print elements
for (i=0;i<8;i++) {printf("%5d",ia[i]);}
printf("\n\n");

printf("End of program\n");
_getch();
}

/* Get integer array and change it (add 10) **********************/
void suba (int ix[]) {
int i;

printf("suba01"); // print elements
for (i=0;i<8;i++) {printf("%5d",ix[i]);}
printf("\n");

for (i=0;i<5;i++) {ix[i]+=10;} // change elements of array

printf("suba02"); // print elements
for (i=0;i<8;i++) {printf("%5d",ix[i]);}
printf("\n");
}

/* Get pointer to int array, change it (add 200) **************/
void subb (int *px) {
int i;

printf("subb01"); // print elements
for (i=0;i<8;i++) {printf("%5d",*(px+i));}
printf("\n");

for (i=0;i<5;i++) {*(px+i)+=200;} // change elements of array

printf("subb02"); // print elements
for (i=0;i<8;i++) {printf("%5d",*(px+i));}
printf("\n");
}

/* eof ************************************************/


003
Pointers - Integer Array
Dieses Beispiel ist eine kleine Variante von Programm 2: An Stelle des int array wird hier eine char array eingesetzt - ein string. Sie kennen bereits die enge Verwandtschaft von arrays und pointers. Hier wird diese Technik auf strings angewendet - in C nichts anderes als arrays vom Typ char:

Zuerst wird das array mit 0-bytes initialisiert: erstens ist das vernünftig, weil sie damit in jedem Fall den string abschließen, zweitens erkennen sie dadurch Änderungen leichter.

Danach senden sie das array an Unterprogramm suba, welches wie bisher versucht, das Argument zu ändern - erfolgreich, wie bei jedem array, das übergeben wird. Zur Kontrolle sehen sie jeweils vorher und nachher die strings ausgedruckt.

Zuletzt wird ein Pointer auf das array an subb übergeben: Auch in diesem Fall kann das Unterprogramm die Werte des arrays ändern. In einigen Kommentaren sheen sie äquivalente Befehle in beiden Syntax-Formen: array und pointer.

/*
Program to demonstrate pointers (strings)
Version 1.0 / 2001.09.01.
Peter Schindler pstrainer@gmx.net
*/
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>

/* Declaration of globals *****************************/
void suba (char x[]);
void subb (char *px);

/* Main program *************************************/
void main (void){
int i;
char s[100];
char *ps;

// init string
for (i=0;i<=100;i++) {s[i]='\0';}

printf("Pointer Test Program\n");
printf("Enter a string: ");
scanf("%s",&s);
printf("\n");

// set pointer ps to the address of s
// Mind: ps=s is equivalent to ps=&s[0]
// Therefore s[i] is equivalent to *(s+i)
// and &s[i] is equivalent to s+i
ps=s;

// send string (pointer!) to subroutine
printf("main01 s=%s ps=%d\n",s,ps);
suba(s);
printf("main02 s=%s ps=%d\n\n",s,ps);

// send pointer to subroutine
printf("main03 s=%s ps=%d\n",s,ps);
subb(ps);
printf("main04 s=%s ps=%d\n\n",s,ps);

printf("End of program\n");
_getch();
}

/* Get string (pointer) and change it ******************/
void suba (char x[]) {
printf("suba01 x=%s\n",x);
x[0]='0'; // change to '0'
x[1]='1'; // change to '1'
printf("suba02 x=%s\n",x);
}

/* Get pointer to string, change chars *****************/
void subb (char *px) {
int i;
char c;
// print the incoming string
printf("subb01 *px=");
// warning! this does not work: printf("%s",*px);
i=0;
c='$';
while (c!='\0') {
c=*(px+i++);
printf("%c",c);
}
printf(" px=%d\n",px);

// change string
*px++='$'; // change to '$' and inc pointer
*px--='$'; // change to '$' and dec pointer

// print the changed string
printf("subb02 *px=");
i=0;
c='$';
while (c!='\0') {
c=*(px+i++);
printf("%c",c);
}
printf(" px=%d\n",px);
}

/* eof ************************************************/


004
Programm "Pointertest Float 1"
Aufgabe: Schreiben sie ein Programm, das zwei reelle Zufalls-Zahlen im Intervall 0...100 erzeugt. Übergeben sie die Zahlen an ein Unterprogramm, welches die jeweils 2. der beiden Zahlen durch das Produkt der beiden Zahlen ersetzt.

005
Programm "Pointertest Float 2"

Aufgabe: Schreiben sie ein Programm, das 5000 reelle Zufalls-Zahlen im Bereich 100...300 erzeugt. Übergeben sie das array an ein Unterprogramm, welches alle Zahlen>200 durch die Zahl 200.0 ersetzt.

006
Programm "Stringtest 1"
Aufgabe: Schreiben sie ein Unterprogramm, das in einen string Wiederholungen eines Zeichen schreibt. Geben sie dazu als Argumente den string, das Zeichen und die Anzahl der Wiederholungen ein.

007
Programm "Stringtest 2"

Aufgabe: Schreiben sie ein Unterprogramm, das aus 2 strings einen dritten zusammensetzt. Geben sie als Argumente die 3 strings an, etwa nach dem Muster a & b -> c.
Geben sie zur Übung den ersten string über die Konsole ein, den 2. string nach Programm 006.
  Testen sie ihr Programm !

Homepage von PS-Trainer - Entwicklung - an PS-Trainer

Aktuelle Daten dieser Seite Letzte Änderung:
  Geocities