Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » kopie oder kein kopie das ist die frage?

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
27.03.2006, 14:43 Uhr
ref



In diesem beispiel , ist der wert von str wie erwarted geändert , weil str ist ein zeiger
und sein adresse beeinflußt wird .


C++:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void stradd(char *s1, char *s2);
void stradd(char *s1,int i);

int main()
{
    char str[80];
    strcpy(str, "Hallo");
    stradd(str,"dort");
    cout<< str <<"\n";
    

    stradd(str, 100);
    cout << str<<"\n";

    return 0;
}
// verbinde zwei zeichenketten
void stradd(char *s1,char *s2)
{

    strcat(s1,s2);

}

// verbinde eine zeichenkette und
// ein int (als zeichenkette)
    
    void stradd(char *s1,int i)
    {
    
    char temp[80];

    sprintf(temp,"%d", i);
    strcat(s1, temp);
    }





resultat:

Hallodort
Hallodort100


also in strcat(s1, s2); wird nicht nur s1 geändert sondern str auch
ich habe dann anderungen in diesem code gemacht , die zeigern s1 und s2
durch normale arrays ersetzt ,ich wollte wissen ob normale arrays wie zeigern verhalten
oder integers





C++:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
void stradd(char s1[10], char s2[10]);
void stradd(char *s1,int i);

int main()
{
    char str[80];
    strcpy(str, "Hallo");
    stradd(str,"dort");
    cout<< str <<"\n";
    

    stradd(str, 100);
    cout << str<<"\n";

    return 0;
}
// verbinde zwei zeichenketten
void stradd(char s1[10],char s2[10])
{

    strcat(s1,s2);

}

// verbinde eine zeichenkette und
// ein int (als zeichenkette)
    
    void stradd(char *s1,int i)
    {
    
    char temp[80];

    sprintf(temp,"%d", i);
    strcat(s1, temp);
    }







selbe resultat :
Hallodort
Hallodort100

die frage , warum verhalten normale arrays NICHT wie integers ??,es handelt sich hier
nicht um adressen , oder?
bei integers wird
kopien gemacht und so die werte in main wird NICHT geändert
wie diese code zeigt :


C++:
// Listing 11.4 Zeigt die Übergabe als Wert

#include <iostream>



void swap(int x, int y);



int main()

{

     int x = 5, y = 10;



     std::cout << "Main. Vor Vertauschung, x: " << x

                                 << " y: " << y << "\n";

     swap(x,y);

     std::cout << "Main. Nach Vertauschung, x: " << x

                                 << " y: " << y << "\n";

     return 0;

}



void swap (int x, int y)

{

     int temp;



     std::cout << "Swap. Vor Vertauschung, x: " << x

                                 << " y: " << y << "\n";



     temp = x;

     x = y;

     y = temp;



     std::cout << "Swap. Nach Vertauschung, x: " << x

                                << " y: " << y << "\n";



}

resultat :
Main. Vor Vertauschung, x: 5 y: 10
Swap. Vor Vertauschung, x: 5 y: 10
Swap. Nach Vertauschung, x: 10 y: 5
Main. Nach Vertauschung, x: 5 y: 10



--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.03.2006, 15:56 Uhr
RHBaum




Zitat:

die frage , warum verhalten normale arrays NICHT wie integers ??,es handelt sich hier
nicht um adressen , oder?
bei integers wird
kopien gemacht und so die werte in main wird NICHT geändert

es handelt sich hier
nicht um adressen , oder?



doch genau so !

C kennt keine referenz-uebergabe ^^
C Macht immer nur kopien !

der unterschied:

eine normale variable repraesentiert ihren wert.
sprich der funktionsaufruf kopiert deine werte und du arbeitest auf den kopien.

Bei einem Array repraesentiert die variable einen zeiger auf das erste Element in dem array

also:
int a[10]; ist a eigentlich ein int * und konvertierungen dahin sind ohne problem moeglich. die groesse des arrays merkt sich der compiler nich, da musst selber aufpassen. beim zerstoeren des arrays ist das aber kein problem, da das der compiler ueber die stackzeiger macht ...

dein funktionsaufruft macht also wieder das selbe, es kopiert seinen parameter, in dem falle den ZEIGER !!! ... welcher immer noch auf das 1. element im array zeigt. da du in deiner funktion aber nicht mehr den parameter selber (zeiger) bearbeitest, sondern das worauf er zeigt, ist das eben fuer die aufrufende instanz transparent.
In C die einzige moeglichkeit aufrufe per referenz zu implementieren ...

Fazit, Arrays kann man immer nur per referenz quasi uebergeben !

Ciao ...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.03.2006, 16:28 Uhr
ref



danke für erklärung
--
Man kann ein Problem nicht mit der gleichen Denkweise lösen, mit der es erschaffen wurde. (Albert Einstein)
 
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: