Oppure

Loading
19/01/21 21:10
AldoBaldo
Apro questo nuovo filone perché in quello originale ("Trasformare byte array in char";) stavamo andando fuori tema.

Cerco di rispondere alla tua domanda con qualche esempio, perché se mi lancio lungo la china delle spiegazioni verbali non ne esco. Il tema ricade sotto la categoria "aritmetica dei puntatori".

#include <stdio.h>
#include <stdint.h>

#define SPIAZZAMENTO      6

int main() {
    char b[256];
    void *p;

    /* tipo di dati a 8 bit */
    printf( "\nimposto p=b=0x%p\n", p=b );
    printf( "\napplico a p uno spiazzamento di %d int8_t\n", SPIAZZAMENTO );
    p = ((int8_t*)p) + SPIAZZAMENTO;
    printf( "ora p e' avanzato di %d bytes rispetto a b\n",
            SPIAZZAMENTO*sizeof(int8_t) );
    printf( "b=0x%p\tp=0x%p\n", b, p );
    printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
    printf( "(int8_t*)p-(int8_t*)b=%d posizioni\n", (int8_t*)p-(int8_t*)b );

    /* tipo di dati a 16 bit */
    printf( "\nimposto p=b=0x%p\n", p=b );
    printf( "applico a p uno spiazzamento di %d int16_t\n", SPIAZZAMENTO );
    p = ((int16_t*)p) + SPIAZZAMENTO;
    printf( "ora p e' avanzato di %d bytes rispetto a b\n",
            SPIAZZAMENTO*sizeof(int16_t) );
    printf( "b=0x%p\tp=0x%p\n", b, p );
    printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
    printf( "(int16_t*)p-(int16_t*)b=%d posizioni\n", (int16_t*)p-(int16_t*)b );

    /* tipo di dati a 32 bit */
    printf( "\nimposto p=b=0x%p\n", p=b );
    printf( "applico a p uno spiazzamento di %d int32_t\n", SPIAZZAMENTO );
    p = ((int32_t*)p) + SPIAZZAMENTO;
    printf( "ora p e' avanzato di %d bytes rispetto a b\n",
            SPIAZZAMENTO*sizeof(int32_t) );
    printf( "b=0x%p\tp=0x%p\n", b, p );
    printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
    printf( "(int32_t*)p-(int32_t*)b=%d posizioni\n", (int32_t*)p-(int32_t*)b );

    /* tipo di dati a 64 bit */
    printf( "\nimposto p=b=0x%p\n", p=b );
    printf( "applico a p uno spiazzamento di %d int64_t\n", SPIAZZAMENTO );
    p = ((int64_t*)p) + SPIAZZAMENTO;
    printf( "ora p e' avanzato di %d bytes rispetto a b\n",
            SPIAZZAMENTO*sizeof(int64_t) );
    printf( "b=0x%p\tp=0x%p\n", b, p );
    printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
    printf( "(int64_t*)p-(int64_t*)b=%d posizioni\n", (int64_t*)p-(int64_t*)b );

    return 0;
}
ATTENZIONE! Sono un hobbista e l'affidabilità delle mie conoscenze informatiche è molto limitata. Non prendere come esempio il codice che scrivo, perché non ho alcuna formazione accademica e rischieresti di apprendere pratiche controproducenti.
20/01/21 16:23
Carlo
L'esempio è calzante, l'ho compilato, è chiaro, ma devo metabolizzare...
Grazie, ci studio sopra un po'.:yup:
in programmazione tutto è permesso