C Zeiger auf Funktionen

atiufi

Cadet 2nd Year
Registriert
März 2016
Beiträge
24
Hallo,
ich wollte mal fragen wie Zeiger auf Funktionen funktioniert.
Ich habe eine Aufgabe gehabt mit 2 Arrays,wo ich die Anzahl der Elemente und die Werte der einzelnen Elemente eingeben muss und mit diesen 2 Arrays soll ich ein drittes gemischtes Array aus beiden machen.
Die Aufgabe habe ich einigermaßen verstanden und habe mir mal den Code dazu angeschaut, ich habe nicht verstanden wieso die Funktion folge_einlesen ein Pointer ist und was das bringen soll. Ich verstehe die normalen Pointer, die Zeigen halt auf Speicheradressen und dadurch kann man den Wert ausgeben, aber nicht wie das bei Funktionen geht.
Ich hoffe ihr könnt mich aufklären.
Hier mal der Code:
C:
#include <stdio.h>
#include <stdlib.h>

int *folge_einlesen(int length) {

    // Speicherplatz fuer die Folge reservieren.
    int *folge = malloc(length * sizeof(int));
    // Pruefen ob es erfolgreich war.
    if (folge == NULL) {
        printf("Fehler bei der Speicherallokation\n");
        return(NULL);
    }

    // Die Werte einlesen.   
    int i;
    for (i = 0; i < length; ++i) {
        printf("%d. Element: ", i + 1);
        scanf("%d", &folge[i]);
    }

    return(folge);
}

int main() {
    int laenge = 0, *folge1, *folge2;

    int eingabe_gueltig;

    do {
        printf("Laenge der einzugebenden Folgen eingeben:");
        eingabe_gueltig = scanf("%d", &laenge);
        // Den Eingabepuffer leeren
        while ((getchar()) != '\n');
    }
    while(eingabe_gueltig <= 0 || laenge <= 0);

    // Elemente der ersten Folge einlesen
    printf("\nElemente der ersten Folge eingeben\n");
    folge1 = folge_einlesen(laenge);
    if (folge1 == NULL) {
        printf("Fehler beim Erzeugen der Folge\n");
        return(1);
    }

    // Elemente der zweiten Folge einlesen
    printf("\nElemente der zweiten Folge eingeben\n");
    folge2 = folge_einlesen(laenge);
    if (folge2 == NULL) {
        printf("Fehler beim Erzeugen der Folge\n");
        return(1);
    }

    // Speicherplatz fuer eine neue Folge doppelter Laenge reservieren
    int *folge3 = malloc(2 * laenge * sizeof(int));
    if (folge3 == NULL) {
        printf("Fehler bei der Speicherallokation\n");
        return(1);
    }

    // Die Inhalte von folge1 und folge2 abwechselnd in folge3 speichern
    int i;
    for (i = 0; i < laenge; ++i) {
        folge3[2 * i] = folge1[i];
        folge3[2 * i + 1] = folge2[i];
    }
        
    // folge3 ausgeben
    printf("\nGemischtes Array ist: ");
    for (i = 0; i < 2 * laenge; ++i)
        printf("%d ", folge3[i]);

    printf("\n");
    
    free(folge1);
    free(folge2);
    free(folge3);

    folge1 = folge2 = folge3 = NULL;
        
    return(0);
}

Mit freundlichen Grüßen

atiufi
 
Hier gibt die Funktion folge_einlesen() einen Pointer zurück, das hat den vorteil dass der Rückgabe-Wert nicht kopiert werden muss, sondern nur ein Verweis darauf übergeben wird, also ein Pointer.

Hier wird ein int-Pointer von der Funktion zurückgegeben der auf den Speicherbereich Zeigt der in der Funktion durch malloc() reserviert wurde. Durch die Übergabe des Pointers musst du nicht den ganzen Speicherbereich als Kopie auf dem Stack ablegen sondern nur die Referenz auf den Speicherbereich übergeben.

Es gibt aber auch wirkliche Funktions-Pointer, also Zeiger auf Speicheradressen an dem der Code der Funktion beginnt, es ist hier aber kein solcher Funktions-Pointer vorhanden.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: atiufi
Das ist hier kein "Zeiger auf Funktionen" sondern das sind normale Funktionen, die "Zeiger auf int" zurückliefern. Der Zeiger auf int kann auf einen einzelnen int oder auf einen Block von ints (wie hier) zeigen.

/edit: @Schrank war schneller und hat im Grunde das Gleiche gesagt.
 
  • Gefällt mir
Reaktionen: atiufi und Schrank
Schrank schrieb:
Hier gibt die Funktion folge_einlesen() einen Pointer zurück, das hat den vorteil dass der Rückgabe-Wert nicht kopiert werden muss, sondern nur ein Verweis darauf übergeben wird, also ein Pointer.

Hier wird ein int-Pointer von der Funktion zurückgegeben der auf den Speicherbereich Zeigt der in der Funktion durch malloc() reserviert wurde. Durch die Übergabe des Pointers musst du nicht den ganzen Speicherbereich als Kopie auf dem Stack ablegen sondern nur die Referenz übergeben.

Es gibt aber auch wirkliche Funktions-Pointer, also Zeiger auf Speicheradressen an dem der Code der Funktion beginnt, es ist hier aber kein solcher Funktions-Pointer vorhanden.
blöderidiot schrieb:
Das ist hier kein "Zeiger auf Funktionen" sondern das sind normale Funktionen, die "Zeiger auf int" zurückliefern. Der Zeiger auf int kann auf einen einzelnen int oder auf einen Block von ints (wie hier) zeigen.

/edit: @Schrank war schneller und hat im Grunde das Gleiche gesagt.
danke euch beiden dann habe ich das Thema falsch verstanden gehabt. Vielen dank für die Aufklärung :)
 
  • Gefällt mir
Reaktionen: Schrank
Zurück
Oben