Ingo schrieb:
> Wie komme ich auf den Array Index und wie auf den Inhalt?
Die Frage ist eigentlich: Wozu brauchst du dieses konkret?
Denn ...
> Jetzt möchte ich einer Funktion, dieses Array übergebem:
> void Fkt (int* pArray)
> {
> /* Hier wird einmal der Arrayindex gebraucht und der Inhalt des Feldes*/
>
> }
>
> Fkt (&Array[x]);
...
die Funktion hat keine Möglichkeit festzustellen, was mit diesem
Pointer, den sie bekommt, los ist. Alles was sie weiß, ist:
Ich kriege einen Pointer auf einen int
1 | void Fkt( int* pIntWert )
|
2 | {
|
3 | ...
|
4 | }
|
Ob dieser Pointer jetzt auf einen einsamen int zeigt ...
1 | int main()
|
2 | {
|
3 | int i;
|
4 |
|
5 | Fkt( &i );
|
6 | }
|
... oder ob dieser int Teil einer Struktur ist ...
1 | struct check
|
2 | {
|
3 | int a;
|
4 | int b;
|
5 | }
|
6 |
|
7 | int main()
|
8 | {
|
9 | struct check myVar;
|
10 |
|
11 | Fkt( &(myVar.b) );
|
12 | }
|
... ob dieser int durch eine Speicherallokierung entstanden ist ...
1 | int main()
|
2 | {
|
3 | int * pAlloc = malloc( 1 * sizeof(int) );
|
4 |
|
5 | Fkt( pAlloc );
|
6 | }
|
ob dieser int Teil eines Arrays ist
1 | int main()
|
2 | {
|
3 | int Werte[5];
|
4 |
|
5 | Fkt( &Werte[3] );
|
6 | }
|
... oder ob dieser Pointer eventuell sogar auf den ersten int eines
Arrays zeigt und so stellvertretend für das ganze Array steht ...
1 | int main()
|
2 | {
|
3 | int Werte[5];
|
4 |
|
5 | Fkt( Werte );
|
6 | }
|
... all das weiß die Funktion nicht und sie kann es auch nicht
feststellen. Alles was die Funktion weiß ist: da ist ein Pointer und der
zeigt auf einen Speicherbereich, an dem ein int angesiedelt ist.
Nicht mehr und nicht weniger. Die Funktion hat keine Möglichkeit anhand
des Pointers festzustellen, wie und woher und in welchem Zusammenhang
dieser Pointer entstanden ist. Für sie ist das einfach nur eine Adresse
im Speicher, an der sie die Bytes vorfindet, die einen int bilden.
Der Fall 'ein Array wird übergeben, in dem man die Startadresse des
Arrays übergibt', ist ein Sonderfall, der auf einer Konvention, einer
Vereinbarung zwischen Funktion und Aufrufer, beruht, für die der
Programmierer verantwortlich ist. Die Funktion tut so, als ob die
Adresse die Startadresse eines Arrays wäre. Sie tut das deswegen, weil
du als Progammierer weißt, dass du die Funktion so benutzen willst und
du daher (als Programmierer) sicherstellst, dass alle Aufrufe auch in
dieser Form erfolgen. Aber das ist nur eine Konvention, für deren
Einhaltung der Programmierer verantwortlich ist. Weder beim Aufruf noch
in der Funktion gibt es eine Möglichkeit, diesen Sachverhalt zu
forcieren oder zu überprüfen oder abzutesten. Die Funktion bekommt
lediglich einen Pointer. Nicht mehr.