Código executável completo demonstrando aritmética de ponteiros com ptrdiff_t, ponteiros duplos **ptr e ordenação polimórfica com qsort().


📄 Exemplo 1: Subtração de Ponteiros e ptrdiff_t (aritmetica_distancia.c)

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

int main(void) {
    int32_t sensorLogs[10] = {10, 20, 30, 40, 50, 60, 70, 80, 90, 100};

    int32_t *ptrInicio = &sensorLogs[0];
    int32_t *ptrFim    = &sensorLogs[7]; // Aponta para o elemento 80

    // Subtração de ponteiros retorna a distância em número de elementos (ptrdiff_t)
    ptrdiff_t distancia = ptrFim - ptrInicio;
    intptr_t bytesDiferenca = (uintptr_t)ptrFim - (uintptr_t)ptrInicio;

    printf("====================================================\n");
    printf(" 📐 ARITMETICA DE PONTEIROS E DISTANCIA DE MEMORIA\n");
    printf("====================================================\n");
    printf(" Endereco ptrInicio: %p (Valor: %d)\n", (void*)ptrInicio, *ptrInicio);
    printf(" Endereco ptrFim:    %p (Valor: %d)\n", (void*)ptrFim, *ptrFim);
    printf("----------------------------------------------------\n");
    printf(" Distancia em Elementos (ptrdiff_t): %td elementos\n", distancia);
    printf(" Distancia Fisica Real em Bytes:    %td bytes (7 * 4B)\n", bytesDiferenca);
    printf("====================================================\n");

    return 0;
}

📄 Exemplo 2: Callbacks de Ordenação com qsort() (callbacks_qsort.c)

#include <stdio.h>
#include <stdlib.h>

// 1. Comparador para Ordem Crescente
int compararCrescente(const void *a, const void *b) {
    double valA = *(const double*)a;
    double valB = *(const double*)b;
    if (valA < valB) return -1;
    if (valA > valB) return 1;
    return 0;
}

// 2. Comparador para Ordem Decrescente
int compararDecrescente(const void *a, const void *b) {
    double valA = *(const double*)a;
    double valB = *(const double*)b;
    if (valA > valB) return -1;
    if (valA < valB) return 1;
    return 0;
}

void imprimirArray(const double arr[], size_t n) {
    for (size_t i = 0; i < n; i++) printf("%.2lf ", arr[i]);
    printf("\n");
}

int main(void) {
    double medicoes[] = {98.6, 37.2, 40.1, 36.5, 38.9, 39.4};
    size_t n = sizeof(medicoes) / sizeof(medicoes[0]);

    printf("Original:    ");
    imprimirArray(medicoes, n);

    // Ordenação Crescente
    qsort(medicoes, n, sizeof(double), compararCrescente);
    printf("Crescente:   ");
    imprimirArray(medicoes, n);

    // Ordenação Decrescente
    qsort(medicoes, n, sizeof(double), compararDecrescente);
    printf("Decrescente: ");
    imprimirArray(medicoes, n);

    return 0;
}