PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zeiger



snoopdogg2001
10.02.2002, 19:12
nAbend wollte einfach mal fragen wozu man Zeiger eigentlich grundsätzlich einsetzt, weil int *ptr = x;
und dann über *ptr einen wert auf x zuzuweisen ist doch blöd und umständlich da könnte man ja gleich den wert auf x setzen,das ist net so umständlich!!
aslo warum und wozu setzt man Zeiger ein??

sauron3000
10.02.2002, 19:45
Hi
man setzt zeiger z.b ein um keine kopie einer variablen/struct oder was auch immer sondern die eigentlichen daten zu übergeben/manipuieren (also die referenz)...das spart speicher und zeit...

mfg sauron

Fantomas
11.02.2002, 12:50
Es gibt eine Übergabe von Werten nach Call-by-Value oder Call-by-Reference. Wenn du nun einen Wert an x zuweist, und mit ihm dann arbeiten willst, z.B. als Argument übergeben, wie funktion(x), dann übergibst du dieser Funktion nicht den eigentlichen Wert von x, sondern eine Kopie (by-Value). Möchtest du nun aber direkt auf die Speicherstelle zugreifen, die also den Wert von x repräsentiert, musst du by-Reference, also die Speicherstelle übergeben. Diese Speicherstelle wird durch einen Zeiger dargestellt. Ein weiterer Vorteil von Zeigern ist, dass du aussagefähige Namen verwenden kannst.

________
tempus semper vincit

chris
11.02.2002, 13:31
Mehrdimensionale Datenstrukturen wären ohne Zeiger überhaupt nicht denktbar, zum beispiel ein Array , das Zeiger auf char enthält oder ein Array, das Zeiger auf Arrays enthält.
Ebenso benötigst du Zeiger bei verketteten Listen o.ä.

Beispiele:


int mul_arr[2][5]; /* Array mit 2 indizes, die jeweils auf ein 4 Elementieges Array zeigen */

char *argv[]; /* oft 2tes Argument der main() funktion) */

struct something *bla; */ Zeiger auf Struktur something */

// ....

thodi
11.02.2002, 13:34
Original geschrieben von Semtex
Ein weiterer Vorteil von Zeigern ist, dass du aussagefähige Namen verwenden kannst.

Hmm? Wieso das?


int anzahl_der_iterationen = 0;
int *aewrqwer = anzahl_der_iterationen;

Fantomas
11.02.2002, 14:03
Wie du den Code schreibst, ist nicht meine Sache.

_________
tempus semper vincit

ChaosAngel
11.02.2002, 14:06
Du kannst mit Zeigern auch dynamisch speicher anfordern und so zum Beispiel zur Laufzeit die grösse eines Arrays bestimmen




int Anzahl;
char* Array;
cin >> Anzahl;
Array = new char[Anzahl];
// benutzung des Anzahl grossen Arrays
delete Array; // Speicher wieder frei geben

thodi
11.02.2002, 14:22
Original geschrieben von Semtex
Wie du den Code schreibst, ist nicht meine Sache.

Klar. Aber warum bringen gerade Zeiger den Vorteil, aussagekraftige Namen verwenden zu koennen? Das verstehe ich nicht.

zeronull
11.02.2002, 15:07
Aber warum bringen gerade Zeiger den Vorteil, aussagekraftige Namen verwenden zu koennen? Das verstehe ich nicht.

Kein Wunder, dass du es nicht verstehst ... es ist Schwachsinn.

Andere Anwendungsmöglichkeiten für Pointer(C++): Polymorphismus

Fantomas
12.02.2002, 08:54
Ist ja auch zu schwer zu verstehen, wenn man schreibt:

int aewrqwer = 0;
int* anzahl_der_iterationen = aewrqwer;

Logik hat noch keinem geschadet, und nachdenken erst recht nicht @ xcube

_______
tempus semper vincit

thodi
12.02.2002, 08:58
Aaargh. Zeige mir bitte ein Beispiel, wo man fuer einen Zeiger einen aussagekraeftigeren Namen als fuer eine normale Wert-Variable benutzen kann. Nur eins, und ich glaube dir. Zeiger sind Variablen wie andere auch, die Namensgebugsregeln sind exakt die selben.

Fantomas
12.02.2002, 09:42
OK, das Beispiel war Mist. Sorry !

___________
tempus semper vincit

zeronull
12.02.2002, 16:54
Ein weiterer Vorteil von Zeigern ist, dass du aussagefähige Namen verwenden kannst.

Ein Privileg, dass deiner Meinung nach nur Pointer haben?


thodi:

Zeiger sind Variablen wie andere auch, die Namensgebugsregeln sind exakt die selben.

Genauso und nicht anders ist es.


Ist ja auch zu schwer zu verstehen, wenn man schreibt:

int aewrqwer = 0;
int* anzahl_der_iterationen = aewrqwer;

Ein normaler Mensch verspürt nicht den Drang ausgerechnet statischen Variablen solche Namen zu geben.


Logik hat noch keinem geschadet [..]

...

Fantomas
12.02.2002, 17:58
@ xcube, hab doch gesagt, dass ich einen Fehler gemacht habe.

Vielleicht solltes du deine Signatur ändern. Der Sieg gebührt den Dümmsten !

zeronull
12.02.2002, 19:35
@ xcube, hab doch gesagt, dass ich einen Fehler gemacht habe.

Wollte trotzdem noch ein Comment dazu abgeben.


Vielleicht solltes du deine Signatur ändern. Der Sieg gebührt den Dümmsten !

Ich denke, es wurden schon genügend Höflichkeiten ausgetauscht. Etwas Produktives kommt dabei ja eh nicht mehr raus, also sollte man die Sache abhaken.

Um noch was zum eigentlichen Thema beizutragen: Pointer auf Funktionen können auch manchmal recht praktisch sein. Ich weiß nicht genau, ob sich das in anderen Sprachen mit Referenzen realisieren lässt.

snoopdogg2001
12.02.2002, 20:45
nAbend jetzt hät ich abern co hne kleine Frage die mir jetzt erst auffällt
also:


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

char zahl[4];

int anzahl;
void main()
{
printf("wort eingeb");
scanf("%s",&zahl);

printf("%s",zahl);
}

also ich hab ein array mit 4 bits.... aber ich kann trotzdem ein wort mit wat weis ich 10 buchstaben eingeben aber normalerweise kann man doch nur für einen char einen buchstaben oder irre ich mich da??
ich bin da grad erst drauf gekommen weil
ChaosAngel mit dem Beispiel für die Array größe verändern angekommen ist. Dann bringt das ganz doch nix.
Nichts das ich jetzt hier kein Kritiker bin der Zeiger aus C rausnehmen will nein ich will nur ganz gerne wissen was die wirklich bringen weil irgend wie mit den arrays bringt es das net

mfg
snoopdog

dumm'
12.02.2002, 21:03
scanf("%s",&zahl);

printf("%s",zahl);

ka., was du jetzt meinst, aber dieses & bei arrays ist nicht nötig und würde bei pointern sogar in dieser form falsch sein. Ihr könnt mal gucken, was bei


#include <stdio.h>

int main()
{
char ch[2];

printf("0x%p zu 0x%p\n",ch,&(&(&(&(&ch)))));
}

rauskommt. Und dann as gleiche mal mit pointern machen.

etuli

snoopdogg2001
12.02.2002, 21:07
ja also ich hätte das ganze auch mit gets schreiben können dann wäre des gets(zahl);

naja jedenfalsl wenn ich z.B. nen array mit 4 dingern machen dann kan ncih aber trotzdem snoopdog eingeben und der gibt mir das auch wieder aus obwohl das array ja nur 4 dinger groß ist. also was bringt das ganze ich könnte somit ja auch ein array mit [1] deklarieren udn nen riesen satz reinschreiben und würde sogar speicher sparen oder???

dumm'
12.02.2002, 21:23
hmmm...entweder er nimmt die grösse dann vom string, oder er überschreibt seinen bereich einfach. ersteres geht bei mir nicht. Zweites wär schlimm, weil so fehler entstehen können, wenn du z.b. direkt imf folgespeicher weitere daten unterbringst und so deine daten überschreibst.
GCC gibt ne Warnung


test.c:1: warning: initializer-string for array of chars is too long

bcc32


Error:noname01.c(5,27):Too many initializers

Most Significant Byte
12.02.2002, 22:12
Original geschrieben von snoopdogg2001
naja jedenfalsl wenn ich z.B. nen array mit 4 dingern machen dann kan ncih aber trotzdem snoopdog eingeben und der gibt mir das auch wieder aus obwohl das array ja nur 4 dinger groß ist. also was bringt das ganze ich könnte somit ja auch ein array mit [1] deklarieren udn nen riesen satz reinschreiben und würde sogar speicher sparen oder???

Gibst du mehr als 3 Zeichen ein (3 Zeichen, weil 0x0 standardmässig als Terminierung des Strings mit angehängt wird), so werden die Daten über den für die Eingabe reservierten Platz hinausgeschrieben, was für Verwirrung oder Programmabsturz sorgen kann (siehe etuli's Antwort), oder als Sicherheitsloch von Angreifern ausgenützt werden könnte (Stichwort "Buffer Overflow"). Speicherplatz sparst du damit also keinen, die Daten müssen ja schliesslich irgendwo untergebracht werden.
Bei Zeigern sollte man also immer grösste Vorsicht walten lassen, viele Rechner wurden durch die unachtsame Verwendung davon schon infiltriert!

MfG,
MSB

dumm'
13.02.2002, 15:24
http://www-info2.informatik.uni-wuerzburg.de/dclc-faq/kap5.html

Frage 5.20: Ist char a[3] = "abc"; erlaubt? Was bedeutet das?

Antwort: Das ist in ANSI-C erlaubt, allerdings nur selten nützlich. Es wird ein Array mit 3 Elementen deklariert, das dann mit den drei Zeichen 'a', 'b' und 'c' initialisiert wird, ohne das sonst übliche '\0'-Zeichen am Ende! Das Array enthält also keinen String und kann somit *nicht* mit 'strcpy', 'printf %s' etc. verwendet werden.

Anmerkung von TW::
Nebenbei bemerkt sagt der Standard nichts darüber aus, was mit den Elementen 4 .. 9 in folgender Deklaration zu geschehen hat:

char a[10] = "abc";

Das in 5.1 erwähnte "Technical Corrigendum 2" präzisiert, dass die Elemente 4 bis 9 ausgenullt werden müssen (egal, ob 'a' static, extern oder automatic ist).

References: ANSI Sec. 3.5.7; ISO Sec. 6.5.7; H&S Sec. 4.6.4 p. 98.

aus den faq von de.comp.lang.c . Zufällig gefunden, aber recht interessant.

stefan