Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Arrays mit Pointer durchlaufen

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
08.01.2007, 13:52 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Hi,

ich wollt mal fragen, ob mir einer von euch verraten kann, wie man ein int Array via Zeiger durchläuft.

C++:
#include <iostream>

int main(int argc, char* argv[])
{
    int bla[] = {12,18,21};
    std::cout << *(1+bla) << std::endl;
    return EXIT_SUCCESS;
}

Das geht

C++:
#include <iostream>

int main(int argc, char* argv[])
{
    int bla[] = {12,18,21};
    std::cout << *(++bla) << std::endl;
    return EXIT_SUCCESS;
}

Das hingegen nicht ...
Resultat soll eine Schleife sein wie

C++:
char* foo = "Test";
while(*foo)
{
    std::cout << *(foo++) << std::endl;
}

Nur eben für ein int Array
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.01.2007, 13:59 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


So könnte man es machen

C++:
int i[] = {1,2,3,4,5,6};
    for (int j = 0; j<6; j++)
    {
        printf ("%i\n",*(i+j));
    }


Allerdings hat das wenig Sinn da sich hier der [] Operator eher anbietet.

Wie mit einem char Array in deinem letzten Beispiel kannst du es eh nicht machen da deine Abbruchbedingung dort ja die Binäre Null am Ende eines Char Arrays ist, welche du nur dort hast.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.01.2007, 14:24 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Na ja, auf die Idee bin ich auch schon gekommen, das so zu machen, aber das war ja nicht der Sinn meiner Frage
Wenn beim char Array am ende ein \0 hängt, um das Array abzuschließen, sollte hinter einem int Array doch auch etwas hängen, womit man dann weiß, wann es das Ende erreicht hat?!
Aber meine hauptfrage war eigentlich: Wieso geht *(1+bla) und *(++bla) nicht? Ein Array ist doch in C/C++ nicht anderes, wie ein Pointer?!

EDIT:
Wenn das mit dem Array dann schon nicht geht, wieso geht das hier auch nicht:

C++:
#include <iostream>

int main(int argc, char* argv[])
{
    int foo[] = {12,16,18};
    int* bar = &*foo;
    while(*bar)
    {
        std::cout << *(bar++) << std::endl;
    }
    return EXIT_SUCCESS;
}

Irgendwie muss der Compiler doch auch wissen, wann foo[] zu Ende ist. Wie weiß er es, wenn es keinen "Trenner" gibt zu dem int Array und dem Wert der danach kommt?
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'

Dieser Post wurde am 08.01.2007 um 14:31 Uhr von J-jayz-Z editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.01.2007, 14:51 Uhr
Th



Ein Array ist kein Pointer(!), sondern wird nur bei der Parameterübergabe als Pointer übergeben.
D.h. für dein Beispiel benötigst du einen eigenen Pointer:

C++:
int list[] = {12,18,21, 0}; // 0 als Ende der Liste
int *p = list; // hier wird ein Pointer definiert
while(*p)
  std::cout << *p++<< std::endl;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.01.2007, 15:26 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von J-jayz-Z:

Wenn beim char Array am ende ein \0 hängt, um das Array abzuschließen, sollte hinter einem int Array doch auch etwas hängen, womit man dann weiß, wann es das Ende erreicht hat?!


Nein warum? Du weißt doch wieviele Elemente dein Array hat bzw solltest du es wissen.
Die binäre Null am Ende eines char Arrays ist im Prinziep nichts anderes als bequemlichkeit damit man Stringverarbeitenden Funktionen nicht immer die Länge mitgeben muss um zu wissen wo der String endet.
Bei einem anderem Array ist das aber normalerweise unnötig und darum hat man sich den Platz gespart.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
08.01.2007, 16:24 Uhr
Pablo
Supertux
(Operator)



Zitat von J-jayz-Z:
Na ja, auf die Idee bin ich auch schon gekommen, das so zu machen, aber das war ja nicht der Sinn meiner Frage
Wenn beim char Array am ende ein \0 hängt, um das Array abzuschließen, sollte hinter einem int Array doch auch etwas hängen, womit man dann weiß, wann es das Ende erreicht hat?!
Aber meine hauptfrage war eigentlich: Wieso geht *(1+bla) und *(++bla) nicht? Ein Array ist doch in C/C++ nicht anderes, wie ein Pointer?!

EDIT:
Wenn das mit dem Array dann schon nicht geht, wieso geht das hier auch nicht:

C++:
#include <iostream>

int main(int argc, char* argv[])
{
    int foo[] = {12,16,18};
    int* bar = &*foo;
    while(*bar)
    {
        std::cout << *(bar++) << std::endl;
    }
    return EXIT_SUCCESS;
}

Irgendwie muss der Compiler doch auch wissen, wann foo[] zu Ende ist. Wie weiß er es, wenn es keinen "Trenner" gibt zu dem int Array und dem Wert der danach kommt?


wieso denn alles so kompliziert?


C++:
#include <iostream>

int main(int argc, char* argv[])
{
    int foo[] = {12,16,18};
    int *bar = foo;

    for(int i = 0; i < 3; ++i)
        std::cout << bar[i] << std::endl;
    
    return 0;
}




Zitat:

Wieso geht *(1+bla) und *(++bla) nicht? Ein Array ist doch in C/C++ nicht anderes, wie ein Pointer?!



Sollte eigentlich beide gehen. Und ein Array ist kein Pointer (und ein Pointer ist kein Array). Mann kann einen Pointer wie ein Array behandeln, sind aber 2 unterschiedliche Sachen.
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.01.2007 um 16:33 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
08.01.2007, 17:23 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)


@Pablo

*(++bla) geht in dem Fall nicht weil es, wie du schon richtig gesagt hast, kein Pointer ist sondern ein int Array und somit kein L-Wert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
08.01.2007, 17:29 Uhr
Pablo
Supertux
(Operator)



Zitat von Guybrush Threepwood:
@Pablo

*(++bla) geht in dem Fall nicht weil es, wie du schon richtig gesagt hast, kein Pointer ist sondern ein int Array und somit kein L-Wert.


hab nicht geguckt, was bla wirklich war, ging aber von einem Zeiger aus
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
08.01.2007, 17:48 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


mit sizeof(datentyp)*arraygröße als offset kannst du auch leicht herausfinden wo dein array endet und so mit dem endzeiger vergleichen, wenn man es denn vom zaun brechen will...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 08.01.2007 um 17:48 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
11.01.2007, 11:50 Uhr
RHBaum




Zitat:

Irgendwie muss der Compiler doch auch wissen, wann foo[] zu Ende ist. Wie weiß er es, wenn es keinen "Trenner" gibt zu dem int Array und dem Wert der danach kommt?


Beide wege sind gangbar, haben beide auch ihre berechtigung.

- du merkst dir die laenge ....
- du baust nen ende identifier ein.

problem bei dem identifier ist, dass der indentifier selber nen gueltiger wert deines typs (aus c / C++ perspective) sein muss, dir damit der wertebereich um 1 element verringert wird.

wenn du weisst das 0 niemals als logisch gueltiger wert auftreten darf, kannst den ja auch nehmen zu.

Bei sstrings hat sich eben das angeboten, da fuer ascii 0 eben kein logisch richtiger wert definiert ist ....

ob nun der ascii zeichensatz genau deswegen so definiert ist, oder ob man man strings mit 0 terminiert weil der Zeichensatz so definiert war, keine ahnung ^^

die termination mit nem identifier macht in manchen situationen gewisse dinge einfacher ... wenn man soweiso mit arrays arbeitet die zu gross sind und sich die laengenangabe sparen will ... Serialisieren von mehrern bloecken z.b. wird dann einfacher ...

Ciao ...
 
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: