Archiv verlassen und diese Seite im Standarddesign anzeigen : arrays durch zeiger ersetzen wie ?
Hallo !
Wie kann man arrays durch zeiger ersetzen ?
Ein kleines beispiel Progrämchen wäre echt toll :) :) :)
void selection(int a[], int n)
{ int i,j; int min;
for ( i = 0; i < n -1; i++)
{ min = a [i];
for (j = i + 1; j < n; j++)
if ( a[j] < min) /*Groesse pruefen */
{ min = a [j]; /* und vertauschen,*/
a [j] = a[i]; /* wenn noetig */
a [i] = min;;
}
}
}
Ist meine Lösung richtig?
void selection(int a[], int n)
{ int i,j; int min;
for ( i = 0; i < n -1; i++)
{ min = *(a+i);
for (j = i + 1; j < n; j++)
if ( *(a+j) < min) /*Groesse pruefen */
{ min = *(a+j); /* und vertauschen,*/
*(a+j) = *(a+i); /* wenn noetig */
*(a+i) = min;;
}
}
}
Konstructive Kritik ist erwünscht
naja ... arrays sind nunmal schon zeiger ... aber worauf genau willst denn zeigen?
Felix Kaiser
29.06.2002, 00:12
Arrays sind keine Zeiger, nur Aneinanderreihungen gleicher Typen. Werden aber meist als Zeiger übergeben. Ich glaube er will auf den Array zeigen. Je nach dem wie mans übergibt, wirds als Zeiger übergeben oder falls dies nicht angegeben ist, so wird eine Kopie des Arrays erzeugt und der Funktion übergeben.
Deine Lösung ist ansatzweise richtig, allerdings, wenn du im Code der Funktion den Array als Zeiger referenzierst, solltest du ihn auch so angeben:
void selection(*int a[], int n)
{ ... }
Wenn du einen normalen Array mit a[i] indizierst, so indizierst du den Zeigerarray einfach mit *a[i], keine Runden klammern, die werden für Rangigkeiten bei der Interpretierung und Typenkonvertierungen benutzt ;)
Versuchs mal und beachte das.
@janosch
deine lösung ist vollkommen richtig janosch!
in c/c++ steht der name eines arrays immer für die adresse des ersten elementes. demnach kann man anstatt
int i=array[0] ;
auch genauso
int i=*array;
...schreiben. ist exakt das gleiche.
und deine lösung
*(array+n) ...anstatt... array[n]
ist auch vollkommen richtig!
die klammern sind zwar nicht nötig, aber auch nicht falsch.
der + (plus) operator hat eine höhere priorität als der dereferenzoperator * .
@felix: ich muss dir leider widersprechen!
wenn ein array an eine funktion übergeben wird, wird nie eine kopie
übergeben sondern immer nur die ADRESSE des ersten elementes. ein array als parameter ist IMMER ein referenzparameter. von dort aus kann man dann entweder über den
index "dereferenzieren" oder wahlweise über den dereferenzoperator..... *array+index
@janosch
man kann sogar mit hilfe der dereferenzierung auf zweidimensionale arrays zeigen:
z.B.
int vArray[5][5];
**vArray ...ist das gleiche wie... vArray[0][0]
*vArray[0] ..ist das gleiche wie... vArray[0][0]
*(vArray[2]+3) ..ist das gleiche wie... vArray[2][3]
wenn du einen zeiger auf einen array erzeugen willst dann geht das so:
int vArray[10];
int* pArray;
pArray=vArray;
damit ergäbe dann folgendes das gleiche ergebnis:
cout << vArray[2] << endl;
cout << *pArray+2 << endl;
alle klarheiten nun beseitigt? :-)
greetinX
Felix Kaiser
29.06.2002, 13:45
Also hat hier C einen unschönen Fehler, wenn ichs mal so sagen darf, den es bei Pascal/Delphi nicht gibt ;) Wenn ich eine Variable als 'var' Parameter übergeben an eine Funktion oder Prozedur, dann wird ein Zeiger auf die orginale Variable übergeben, ansonsten wird im Datenspeicher einfach nur ne Kopie davon erzeugt, so dass ich auf den Array lesen und schreiben kann ohne dabei den orginalen zu ändern, ergeben sich viele neue Möglichkeiten dadurch. Wenn das bei C/C++ nicht so ist, ok ...
hab das doppelposting mal gekillt und
@Felix Kaiser
C++ hat die arrays standardmaessig als vars, dadurch ist der aufruf schneller, weil zu 90% kein wert verandert wird und var oft nicht gesetzt wird. du wehe du hast nen fehler drinn dann viel spass beim suchen
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.