Frage zu Pointern



  • Guten Abend,

    habe gerade mein Wissen zu Pointern etwas aufgefrischt und bin nun auf folgenden Code gestoßen, welchen ich nicht verstehe.

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    int **arr_create(int n)
    {
    	int **arr = malloc(sizeof(int*) * n);
    	for(int i=0;i<n;i++)
    		arr[i]=malloc(sizeof(int) * n);
    	return arr;
    }
    
    void arr_fillrandom(int **arr,int n,int r)
    {
    	srand(time(NULL));
    	for(int i=0;i<n;i++)
    		for(int j=0;j<n;j++)
    			arr[i][j] = (rand() % (r-2))+2;
    }
    
    int main(void) {
        int n = 5, r = 5;
        int **arr = arr_create(n);
        arr_fillrandom(arr,n,r);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                printf("%d", arr[i][j]);
            }
            printf("\n");
        }
        return EXIT_SUCCESS;
    }
    

    Und zwar verstehe ich die Funktion int **arr_create() nicht. Was machen die Pointer da vor der Funktion? Weiß vielleicht jemand wie man sowas nennt, dass ich mir nötiges Wissen dazu in Google besorgen kann bzw. kann mir das jemand erklären.

    Habe eigentlich gute C Kenntnisse, jedoch hier fehlt mir jeder Ansatz was leider auch das googeln schwer macht.

    Edit: Ist das ganze sowas wie

    int (*cmp)(void *px,void *py);
    

    ?

    Wäre für jede Hilfe dankbar.

    MfG


  • Mod

    Das ist einfach der Rückgabetyp. Wo die Leerzeichen bei Zeigern stehen, ist egal. Ist es klar wenn ich es mal so schreibe?

    int** arr_create(int n)
    

    So sonderlich gut ist dieser Beispielcode nicht. Ich wäre vorsichtig mich da dran zu orientieren. Fehler und Stilschwächen:
    -Fette Speicherlöcher
    -Eine unnötige Indirektionsebene zu viel
    -Unklare Besitzverhältnisse (aus denen die besagten Speicherlöcher dann die Konsequenz sind)

    Und das sind nur die dicksten Hauer.



  • Die beiden Sterne (rechts vom int) geben an, dass die Funktion einen Zeiger auf einen Zeiger (auf int) zurückgibt.
    Ist auch nicht anders als mit einem * (so wie fgets, strcpy, malloc, strstr, ...)

    Zeile 23 verstehst du?

    Stichwort "Zeiger als Rückgabewert" *

    *hab ich nicht probiert.



  • Achso, ja wenn man das ganze mit int** hinschreibt wird das ganze klar. Ja Zeile 23 versteh ich, ist ja nur ein Zeiger auf einen Zeiger (also wie ein zweidimensionales Array).

    Ja mir ging es bei dem Code eigentlich nur um diese Funktion.

    Eine Frage hätte ich noch, das hier

    int (*cmp)(void *px,void *py);
    

    ist dann aber ein "echter" Funktionspointer und hat nichts mit dem Andere zum tun?

    MfG



  • tobias321 schrieb:

    Eine Frage hätte ich noch, das hier

    int (*cmp)(void *px,void *py);
    

    ist dann aber ein "echter" Funktionspointer und hat nichts mit dem Andere zum tun?

    Jupp. Komplett andere Baustelle.



  • Danke an alle.


Anmelden zum Antworten