Search code examples
cpointersindexingcasting

Is it possible to subscript into a uint64_t pointer in C?


I'm a C beginner. Having trouble understanding whats happening with this code:

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

int main(void)
{
    uint64_t num = 99999;
    uint64_t *num_ptr = &num;

    uint8_t first_byte = ((uint8_t *)num_ptr)[0];

    printf("%hhu", first_byte);

    return 0;
}

This prints 159.

I'm looking at uint8_t first_byte = ((uint8_t *)num_ptr)[0];

I'm trying to understand it this way: the uint64_t pointer num_ptr is first cast as a uint8_t pointer, then we index into it with the square brackets to get the first byte. Is this a correct explanation? If so is it possible to index into pointers to get their partial contents without dereferencing?


Solution

    • 99999 = 0x1869F or if you will as a 64 bit number 0000 0000 0001 869F
    • Intel/PC computers use little endian. What is CPU endianness?
    • Therefore your 64 bit number is stored in memory as 9F86 0100 0000 0000.
    • C allows us to inspect a larger data type byte by byte through a pointer to a character type. uint8_t is a character type on all non-exotic systems.
    • ((uint8_t *)num_ptr)[0]; Converts the 64 bit pointer to a 8 bit (character) pointer and then uses the [] operator to de-reference that pointer.
    • We get the first byte 0x9F = 159 dec.
    • %hhu is used to print unsigned char. The most correct conversion specifier to use for uint8_t would otherwise be "%" PRIU8 from inttypes.h