Array in C


Hallo,

ich möchte eine Funktion schreiben, die ein Integer Array ausgibt. Dabei soll ein Zeiger auf das letzte Element im Array zeigen, wodurch die Größe des Arrays bestimmt wird.

Mein Code:

C:
#include <stdio.h>
#include <stdlib.h>

void print_array(int array[], int *end) {

    for (int i = 0; i < *end; i++) {
        array[i] = i;
    }
    for (int i = 0; i < *end; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main() {

    int a[10];
    int *n = (int *)(&a + 1) - 1;
    print_array(a, *n);

    return EXIT_SUCCESS;
}
Das wäre so meine Idee, aber es funktioniert nicht ganz.
Hat jemand einen Tipp?
 

cwriter

Erfahrenes Mitglied
Hi

Dabei soll ein Zeiger auf das letzte Element im Array zeigen, wodurch die Größe des Arrays bestimmt wird.
Ich verstehe dein Ziel nicht so ganz - ist die Idee, dass im letzten Element des Arrays die Länge gespeichert wird oder soll einfach ein End-Pointer übergeben werden, sodass alle Werte des Arrays in [StartPointer, EndPointer] liegen?
Momentan hast du das Problem, dass
C:
int *n = (int *)(&a + 1) - 1; // n == a
ist, sodass in
C:
for (int i = 0; i < *end; i++)
einfach das erste Element als Länge interpretiert wird.

C:
int *n = (int *)(&a + 1) - 1;
print_array(a, *n);
Das geht schon mal gar nicht durch den Compiler, da *n vom Typ int ist, aber der 2. Parameter von print_array int* sein sollte. *n => n wäre mein Vorschlag.

Für die Variante mit Start- und Endpointer:
C:
for (int* i = array; i <= end; i++) // Bis und mit End-Pointer anschauen
Für die Variante mit Länge als letztes Element
C:
or (int i = 0; i < *end; i++)
Aber dann muss das Array VOR dem Funktionsaufruf befüllt werden...
Übrigens wäre das eine relativ seltsame Variante, die Länge zu übergeben. Eine wesentlich einfachere Variante (da 1 Parameter weniger) ist, die Länge des Arrays im ersten Element zu speichern.

Gruss
cwriter
 
Zuletzt bearbeitet:
Hi


Ich verstehe dein Ziel nicht so ganz - ist die Idee, dass im letzten Element des Arrays die Länge gespeichert wird oder soll einfach ein End-Pointer übergeben werden, sodass alle Werte des Arrays in [StartPointer, EndPointer] liegen?
Momentan hast du das Problem, dass
C:
int *n = (int *)(&a + 1) - 1; // n == a
ist, sodass in
C:
for (int i = 0; i < *end; i++)
einfach das erste Element als Länge interpretiert wird.

C:
int *n = (int *)(&a + 1) - 1;
print_array(a, *n);
Das geht schon mal gar nicht durch den Compiler, da *n vom Typ int ist, aber der 2. Parameter von print_array int* sein sollte. *n => n wäre mein Vorschlag.

Für die Variante mit Start- und Endpointer:
C:
for (int* i = array; i <= end; i++) // Bis und mit End-Pointer anschauen
Für die Variante mit Länge als letztes Element
C:
for (for (int i = 0; i < *end; i++)
Aber dann muss das Array VOR dem Funktionsaufruf befüllt werden...
Übrigens wäre das eine relativ seltsame Variante, die Länge zu übergeben. Eine wesentlich einfachere Variante (da 1 Parameter weniger) ist, die Länge des Arrays im ersten Element zu speichern.

Gruss
cwriter
Bin mir auch nicht sicher, ob ich die Aufgabe richtig verstanden habe.
Ich soll die Funktion void print_array(int array[], int *end) implementieren, die ein Integer Array ausgibt.
"Üblicherweise übergibt man einer solchen Funktion außer dem Array die Anzahl der Elemente des Arrays; verwenden Sie stattdessen einen Zeiger, der auf das letzte Element im Array zeigt.
Wie sieht ein exemplarischer Aufruf dieser Funktion aus?"
 

ComFreek

Mod | @comfreek
Moderator
C:
int arr[] = {1,2,3,4};

print_array(arr, &arr[3]);

// Alternativ (wobei 3 == Länge - 1)
print_array(arr, arr + 3);
 
Könnt ich es so auch machen:

C:
#include <stdio.h>
#include <stdlib.h>

void print_array(int array[], int *end) {

    /*for (int i = 0; i < *end; i++) {
        array[i] = i;
    }*/
    for (int i = 0; i < *end; i++) {
        printf("%d ", array[i]);
    }
    printf("\n");
}

int main() {

    int a[] = { 1, 2, 3, 4, 5, 8, 9, 11 };
    int *n;
    n = a + 5;
    print_array(a, n);

    return EXIT_SUCCESS;
}
 

cwriter

Erfahrenes Mitglied
Könnt ich es so auch machen:
:)

C:
for (int i = 0; i < *end; i++)
Damit schaust du das Element an, worauf end zeigt. In diesem Beispiel eingesetzt:
C:
array = { 1, 2, 3, 4, 5, 8, 9, 11 };

for (int i = 0; i < *(array + 5); i++)
// Also:
for (int i = 0; i < 8; i++)
In deinem Beispiel geht das aus Versehen gerade auf. Aber versuche es mal mit einem anderen Array, z.B.:
C:
array = { 1, 2, 3, 4, 5, 4, 9, 11 };
// oder noch lustiger:
array = { 1, 2, 3, 4, 5, 42424242, 9, 11 };
Gruss
cwriter
 

ComFreek

Mod | @comfreek
Moderator
Dann solltest du Pointer von Grund auf wiederholen. Pointer zeigen auf eine Speicheradresse.
Wenn du jetzt eine Fkt. print_contiguous_int_values(int *start, int *end) haben möchtest, dann musst du den Start und das Ende mit Pointern angeben. Da gibt's schöne Bilder mit Rechtecken - hattet ihr bestimmt auch im Kurs. Um jetzt zum deinem print_array zu kommen, muss man wissen, dass in C Funktionen keine Arrays als Parameter annehmen können.* Oder anders gesagt: Es sind unter der Haube immer Pointer. D.h. dein print_array ist nichts anderes als mein print_contiguous_int_values.

PS: (*) ist eine Vereinfachung und stimmt so nicht.
 

Trulleberg

Mitglied
C:
#include <stdio.h>

void print_array(int array[], int *end) {

    for (; array<=end; array++)
        printf("%d ", *array);

}

int main() {

    int a[] = { 1, 2, 3, 4, 5, 8, 9, 11 };

    print_array(a, a+7); /* 7 == Länge - 1 */

    return 0;

}
 

Neue Beiträge