Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » zeiger unklarheit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
29.01.2007, 14:15 Uhr
tobias
hmm....


Hi Leute, ich schau mir gerade die Klassen etwas genauer an...

dabei ist mir folgendes aufgefallen:


C++:
class Mensch
{
    public:
        void erzeuge(const char *n, unsigned int a, bool g);
};

void Mensch::erzeuge(const char *n, unsigned int a, bool g)
{
     // inhalt unwichtig
}

Mensch Hans;

Hans.erzeuge("Hans", 18, 0);



nun warum wird:

const char *n benutzt? und bei den anderen kein * ?

* ist doch ein zeiger auf eine variable, damit diese nicht kopiert werden muss und man speicher sparen kann... so... wenn das so ist dann frag ich mich warum das nicht bei den anderen zwei parametern gemacht wird...

Bitte helft mir ich bin verwirrt
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
29.01.2007, 15:01 Uhr
BoBtheREapER
kein job für nen BoB


Wenn du einen Zeiger hast, kann dieser sowohl auf ein Array als auch einen einzelnen Wert zeigen. In diesem Fall soll ja ein Mensch mit dem Namen n erzeugt werden. Da der Name nicht nur aus einem einzelnen Buchstaben besteht sondern aus mehreren brauchst du ein Array von Zeichen und das kannst du mit char* n übergeben.
--
"Zwei Dinge sind unendlich: Das Universum und die menschliche Dummheit. Aber beim Universum bin ich mir nicht ganz sicher." - Albert Einstein
www.blue-xenon.de.vu
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
29.01.2007, 15:07 Uhr
tobias
hmm....


achso... das ist jetzt aber nur für chars... wenn ich aber diese strings also:

string str = "lol"; benutze dann brauch ich den zeiger nichtmehr?

also wäre das folgende beispiel auch nutzbar..


C++:
class Mensch
{
    public:
        void erzeuge(const string n, unsigned int a, bool g);
};

void Mensch::erzeuge(const string n, unsigned int a, bool g)
{
     // inhalt unwichtig
}

Mensch Hans;

Hans.erzeuge("Hans", 18, 0);




und reicht: Hans.erzeuge("Hans") oder muss das so sein: Hans.erzeuge(string("Hans"))


Danke
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
29.01.2007, 15:14 Uhr
CppProgrammer



Wenn der erste Parameter nicht const char *n wäre, sondern const char n, also ohne den Pointer, könntest du diese Funktion nicht so aufrufen Hans.erzeuge("Hans", 18, 0);, sondern nur noch so Hans.erzeuge('H', 18, 0);.
char *n ist nämlich mehr oder weniger ein char n[], also praktisch ein Array.
Und da diese Funktion offensichtlich einen String übergeben haben will und nicht nur ein einzelnes Zeichen macht das schon Sinn.
Die restlichen Parameter jedoch auch als Pointer zu schreiben würde da weniger sinnvoll erscheinen.
In C++ werden niemals Array-Werte übergeben. Stattdessen wird ein Pointer auf das erste Element (Index 0) übergeben. Folglich würde also der Compiler void blabla(int i[10]) genauso behandeln wie void blabla(int *i).
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
29.01.2007, 15:40 Uhr
tobias
hmm....


thx das ist net erklärt...
--
Danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
29.01.2007, 16:35 Uhr
0xdeadbeef
Gott
(Operator)


Naja, es wär schon C++-iger,

C++:
class Mensch
{
    public:
        void erzeuge(string const &n, unsigned int a, bool g);
};


zu schreiben.

C++:
string const &n


ist dabei ne Referenz (& auf ne String-Konstante. foo const & ist bei komplexen Datentypen oft ein guter Weg, quasi-per-value-Übergabe zu machen und einen Kopierkonstruktor zu sparen, in diesem Fall also wirklich eine Performanceoptimierung gegenüber

C++:
        void erzeuge(string n, unsigned int a, bool g);


...was nach außen das selbe macht, nur halt etwas langsamer.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.01.2007, 02:39 Uhr
Pablo
Supertux
(Operator)



Zitat von tobias:
achso... das ist jetzt aber nur für chars... wenn ich aber diese strings also:



nein, das hat mit chars nicht zu tun.

Wenn du eine Funktion


C++:
void foo(const datentype* var, ...);



hast, dann teilst du quasi mit, dass die Funktion foo den Inhalt des Speichers, auf den man mittels 'var' zugreift, nicht verändert wird. Und das ist gut so, weil sonst kann es schlimme Folgen haben.

Hier z.b.


C++:
int machewas(char *x)
{
   ...
   /* hier unbekannt, könnte sowas stehen wie: */
    x[0] = toupper(x[0]);
    ...
}



Wenn ich aufrufe:

C++:
machewas("Hallo");



dann gibt es einen dicken Fehler. Bei einer solchen Funktion, deren Inhalt ich nicht kenne, würde ich nie, "Hallo" übergeben, sondern einen Buffer, der überschrieben werden kann, also


C++:
char buffer[] = "Hallo";
machewas(buffer);



Wenn aber machewas so definiert wäre:



C++:
int machewas(const char *x)
{
   ...
   /* hier unbekannt, sowas wie x[0] = toupper(x[0]); ist aber nicht drin */
    
    ...
}



dann weiß ich mit 100% Sicherheit, dass der Inhalt nicht verändert wird, also kann ich sicher

C++:
machewas("Hallo");



ausführe.


Aber wie gesagt, die Benutzung des const beschränkt sich nicht auf char*.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 30.01.2007 um 02:40 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: