Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.11.2009, 13:30

String's in Funktionen

Hallo,

Ich habe folgendes Problem bzw. folgende Frage:

Wieso kann man Char-Arrys (strings) in Funktionsheader mit "Zeiger" bezeichnen?

Beispiel, wie ich dies meine hier:


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>

using namespace std;

void Test1(char *a, char b[]) // 1. Argument: Wieso ein "*a". Dies zeigt doch, dass es sich um einen Zeiger handelt. 2. Argument: Eindeutig - eine Char-Arry.

{
      cout<<a<<endl;
      cout<<b<<endl;
      cout<<" ----- Werte ausgegeben ----- \n"; 
}

void Test2(char *a) // Hier ein "echter" Zeiger. Der Wert ist vorer 'a' und dann 'b'.

{
     *a = 'b';
     cout<<"Adresse:"<<&a<<" Wert:"<<*a<<" Ohne Adresszeichen oder Stern:"<<a<<endl;
     cout<<" ----- Wert ausgegeben ----- \n"; 
}

int main()
{
    Test1("Dies ist ein Test","Dies ebenfalls"); // Gleich Strings eintragen

    
    char Str[3]; // 1. Variante

    Str[0] = 'a';
    Str[1] = 'b';
    
    char Str2[3] = "cd"; // 2. Variante

    
    Test1(Str,Str2); // Strings in Char-Arrys

    
///////////////////////////////////////////////////////////////////////


  char x = 'a';
  cout<<"Vor der Funktion:"<<x<<endl; // 'a'

  Test2(&x); // Adresse übergeben

  cout<<"Nach der Funktion:"<<x<<endl;  // 'b' - Zeiger tat seine Arbeit.                                                                                                                                            

    
    cin.get();
}


Ausgabe:

Dies ist ein Test
Dies ebenfalls
---- Werte ausgegeben ----
ab
cd
---- Werte ausgegeben ----
Vor der Funktion: a
Adresse: 0x27fee0 Wert:b Ohne Addresszeichen oder Stern:bcd
---- Wert ausgegeben ----
Nach der Funktion:b


Ich hoffe mir kann jemand die Augen öffnen :D

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

2

06.11.2009, 15:06

Gemein aber wahr: char *a, char b[] sind äquivalente Ausdrücke für ein Zeiger auf ein Array, wenn sie in einer Parameterliste stehen.
Warum das so ist, können dir sicher unsere C++-Standard-Cracks erklären.
Auch interessant:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>

void groesse(char a[])
{
std::cout << sizeof(a) << std::endl;
}

int main()
{
char *str1 = "erster Test";
char str2[] = "zweiter Test";
std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;

groesse(str1);
groesse(str2);

return 0;
}

Wobei das eine Warnung erzeugen kann. Alternativ geht auch:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>

void groesse(char a[])
{
std::cout << sizeof(a) << std::endl;
}

int main()
{
char str1[] = "zweiter Test";
char *str2 = str1;

std::cout << sizeof(str1) << std::endl;
std::cout << sizeof(str2) << std::endl;

groesse(str1);
groesse(str2);

return 0;
}
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

3

06.11.2009, 15:29

C-/C++-Quelltext

1
Dies zeigt doch, dass es sich um einen Zeiger handelt. 2. Argument: Eindeutig - eine Char-Arry. 

es ist in beiden fällen ein zeiger

man kann keine arrays an funktionen übergeben. dann müsste jedes arrayelement einzelnd kopiert werden. selbst wenn es ginge würde es sehr lange dauern und es würde niemand nutzen.

aus diesem grund kann man nur zeiger auf arrays und nicht die arrays selbst an funktionen übergeben.

4

06.11.2009, 15:31

Wenn man std::string bzw. std::wstring verwenden würde, wäre man von der ganzen Sache abgeschirmt. ;)

Werbeanzeige