💻 Exemplos de Código: Cap 14 - Aritmética de Ponteiros e Callbacks
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;
}