Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Aritmetica dei puntatori
Forum - C/C++ - Aritmetica dei puntatori

Avatar
AldoBaldo (Member)
Guru


Messaggi: 699
Iscritto: 08/01/2015

Segnala al moderatore
Postato alle 22:10
Martedì, 19/01/2021
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".

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <stdint.h>
  3.  
  4. #define SPIAZZAMENTO      6
  5.  
  6. int main() {
  7.     char b[256];
  8.     void *p;
  9.  
  10.     /* tipo di dati a 8 bit */
  11.     printf( "\nimposto p=b=0x%p\n", p=b );
  12.     printf( "\napplico a p uno spiazzamento di %d int8_t\n", SPIAZZAMENTO );
  13.     p = ((int8_t*)p) + SPIAZZAMENTO;
  14.     printf( "ora p e' avanzato di %d bytes rispetto a b\n",
  15.             SPIAZZAMENTO*sizeof(int8_t) );
  16.     printf( "b=0x%p\tp=0x%p\n", b, p );
  17.     printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
  18.     printf( "(int8_t*)p-(int8_t*)b=%d posizioni\n", (int8_t*)p-(int8_t*)b );
  19.  
  20.     /* tipo di dati a 16 bit */
  21.     printf( "\nimposto p=b=0x%p\n", p=b );
  22.     printf( "applico a p uno spiazzamento di %d int16_t\n", SPIAZZAMENTO );
  23.     p = ((int16_t*)p) + SPIAZZAMENTO;
  24.     printf( "ora p e' avanzato di %d bytes rispetto a b\n",
  25.             SPIAZZAMENTO*sizeof(int16_t) );
  26.     printf( "b=0x%p\tp=0x%p\n", b, p );
  27.     printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
  28.     printf( "(int16_t*)p-(int16_t*)b=%d posizioni\n", (int16_t*)p-(int16_t*)b );
  29.  
  30.     /* tipo di dati a 32 bit */
  31.     printf( "\nimposto p=b=0x%p\n", p=b );
  32.     printf( "applico a p uno spiazzamento di %d int32_t\n", SPIAZZAMENTO );
  33.     p = ((int32_t*)p) + SPIAZZAMENTO;
  34.     printf( "ora p e' avanzato di %d bytes rispetto a b\n",
  35.             SPIAZZAMENTO*sizeof(int32_t) );
  36.     printf( "b=0x%p\tp=0x%p\n", b, p );
  37.     printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
  38.     printf( "(int32_t*)p-(int32_t*)b=%d posizioni\n", (int32_t*)p-(int32_t*)b );
  39.  
  40.     /* tipo di dati a 64 bit */
  41.     printf( "\nimposto p=b=0x%p\n", p=b );
  42.     printf( "applico a p uno spiazzamento di %d int64_t\n", SPIAZZAMENTO );
  43.     p = ((int64_t*)p) + SPIAZZAMENTO;
  44.     printf( "ora p e' avanzato di %d bytes rispetto a b\n",
  45.             SPIAZZAMENTO*sizeof(int64_t) );
  46.     printf( "b=0x%p\tp=0x%p\n", b, p );
  47.     printf( "(char*)p-(char*)b=%d bytes\n", (char*)p - (char*)b );
  48.     printf( "(int64_t*)p-(int64_t*)b=%d posizioni\n", (int64_t*)p-(int64_t*)b );
  49.  
  50.     return 0;
  51. }



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.
PM Quote
Avatar
Carlo (Member)
Guru


Messaggi: 1316
Iscritto: 29/01/2018

Segnala al moderatore
Postato alle 17:23
Mercoledì, 20/01/2021
L'esempio è calzante, l'ho compilato, è chiaro, ma devo metabolizzare...
Grazie, ci studio sopra un po'.:yup:


in programmazione tutto è permesso
PM Quote