wo liegt der sinn bei einem pointer auf void ???



  • wo liegt der sinn bei einem pointer auf void ???



  • laesst sich ohne cast in andere pointerformen umwandeln (siehe malloc).
    arithmetik mit void* ist wie arithmetik mit char*, also sizeof == 1.



  • c.rackwitz schrieb:

    arithmetik mit void* ist wie arithmetik mit char*, also sizeof == 1.

    Nein, das ist eine Compilererweiterung (gcc z.B.). void ist ein unvollstandiger Typ, also kann der sizeof-Operator nicht angewendet werden, und Pointerarithmetik mit void* ist nicht möglich.



  • Bashar schrieb:

    void ist ein unvollstandiger Typ, also kann der sizeof-Operator nicht angewendet werden...

    sowas geht aber:

    int s = sizeof(void*);
    

    nur sowas sollte nicht gehen:

    int s = sizeof(void);
    


  • net schrieb:

    Bashar schrieb:

    void ist ein unvollstandiger Typ, also kann der sizeof-Operator nicht angewendet werden...

    sowas geht aber:

    int s = sizeof(void*);
    

    nur sowas sollte nicht gehen:

    int s = sizeof(void);
    

    was bashar meinte war:
    bei
    ++p;

    wird im prinzip folgendes gemacht:

    char* temp=(char*)p;
    temp+=sizeof(*p);
    p=temp;
    

    sizeof(void*) geht natuerlich, weil void* ja ein einfacher zeiger ist und ein zeiger hat eine feste groesse, aber sizeof(*p) geht nicht. und *p geht natuerlich auch nicht 😉



  • net schrieb:

    sowas geht aber:

    int s = sizeof(void*);
    

    Sowas sollte gehen, und eigentlich 4 zurückliefern, weil ein Pointer generell 4 Byte entspricht (Standard-OS). Also sollte das hier

    sizeof( int* )
    sizeof( char* )
    sizeof( double* )
    sizeof( float* )
    

    auch 4 zurückliefern oder 🙂



  • walk0n schrieb:

    net schrieb:

    sowas geht aber:

    int s = sizeof(void*);
    

    Sowas sollte gehen, und eigentlich 4 zurückliefern, weil ein Pointer generell 4 Byte entspricht (Standard-OS). Also sollte das hier

    sizeof( int* )
    sizeof( char* )
    sizeof( double* )
    sizeof( float* )
    

    auch 4 zurückliefern oder 🙂

    naja, es muss nicht unbedingt 4 sein, möglich sind auch 2,3,5,... ja nachdem wie compiler und prozessor mit adressen umgehen...



  • net schrieb:

    sowas geht aber:

    Ich rede ja auch von void und nicht von void* 🙂



  • @oggr

    Der Sinn eines solchen - typenlosen - Pointers liegt darin, auf Speicher zu zeigen
    bei dem der Inhaltstyp(/-größe) nicht bekannt, oder z.B. noch nicht definiert ist.

    malloc zum Spcicher allozieren liefert Dir zum Beispiel einen solchen void* zurück.

    Beispiel:

    struct mensch *hans = (struct mensch*)malloc(sizeof(struct mensch));

    Wie schon angemerkt hat ein void* eine feste Größe. Es ist nämlich ein Pointer auf eine Speicherstelle, und die haette in einem 32bit System eben eine 32bit Adresse.

    Aber Achtung: Wie auch schon angesprochen darfst Du solch einen Pointer nicht "weiterschieben" etc... -> p_void++;

    Das System kann nicht wissen um welche Größe es den Pointer weiterschieben soll, denn er ist typenlos.

    Gruß



  • checkup schrieb:

    malloc zum Spcicher allozieren liefert Dir zum Beispiel einen solchen void* zurück.
    Beispiel:
    struct mensch *hans = (struct mensch*)malloc(sizeof(struct mensch));

    ...und so'n void* kann man jedem anderen pointer zuweisen und umgekehrt. (ein weiterer vorteil von void*). deshalb kannste auch das '(struct mensch*)' vor dem malloc weglassen.



  • net schrieb:

    checkup schrieb:

    malloc zum Spcicher allozieren liefert Dir zum Beispiel einen solchen void* zurück.
    Beispiel:
    struct mensch *hans = (struct mensch*)malloc(sizeof(struct mensch));

    ...und so'n void* kann man jedem anderen pointer zuweisen und umgekehrt. (ein weiterer vorteil von void*). deshalb kannste auch das '(struct mensch*)' vor dem malloc weglassen.

    Echt? Ich krieg das vom Compiler immer angekreidet.



  • #include <stdlib.h>
    


  • b schrieb:

    #include <stdlib.h>
    

    Entweder das, oder er verwendet einen C++-Compiler.



  • Hier der Sinn von Pointer auf void

    void swap(void *a, int i, int j, int size) 
    {
       char c, *ta = a;
       int k;
       for (k = 0; k < size; k++)
       {
         c = *(ta + i * size + k);
         *(ta + i * size + k) = *(ta + j * size + k);
         *(ta + j * size + k) = c;
       }
    }
    

    eine Funktion für alle Typen
    nennt man Generische Programmierung



  • Cefour schrieb:

    eine Funktion für alle Typen

    ..und für was ist die gut?



  • Relativ einfach wenn du ne swap funktion brauchst für int dann kannst du diese hier benutzen.
    Wenn du eine Funktion für float brauchst dann kann man sie nutzen.
    Und wenn du eine Funktion brauchst die eine selbstdefinierte Struktur swapt dann kann man sie nutzen




Anmelden zum Antworten