/** * ============================================================================ * PHM Open Source — Curso de Lógica e Programação em C * Módulo 06: Ponteiros, Endereçamento de Memória e Passagem por Referência * Autor: Prof. Paulo Henrique Maciel · PHM Tech * ============================================================================ * * OBJETIVO DIDÁTICO: * Desmistificar ponteiros em C: entender que um ponteiro é apenas uma variável * que armazena um endereço de memória de outra variável. Dominar o operador de * endereço (&), o operador de desreferenciação (*) e troca de valores (swap). * * COMO COMPILAR E EXECUTAR: * gcc 06_ponteiros_e_memoria.c -o modulo06 && ./modulo06 * ============================================================================ */ #include // Protótipo da clássica função swap que troca dois inteiros por referência void trocarValores(int *ptrA, int *ptrB); int main(void) { printf("====================================================\n"); printf(" PHM TECH — MODULO 06: PONTEIROS E MEMORIA \n"); printf("====================================================\n\n"); // 1. CONCEITO FUNDAMENTAL DE VARIÁVEL E PONTEIRO int valorOriginal = 100; int *ponteiro = &valorOriginal; // ponteiro guarda o endereço (&) de valorOriginal printf("[1] Variavel vs. Ponteiro:\n"); printf(" - Conteudo de valorOriginal : %d\n", valorOriginal); printf(" - Endereco de valorOriginal : %p (&valorOriginal)\n", (void*)&valorOriginal); printf(" - Conteudo do ponteiro : %p (guarda o endereco)\n", (void*)ponteiro); printf(" - Valor apontado (*ponteiro): %d (desreferenciacao)\n\n", *ponteiro); // 2. MODIFICANDO A VARIÁVEL ATRAVÉS DO PONTEIRO printf("[2] Modificacao Indireta:\n"); *ponteiro = 250; // Altera diretamente o byte da memória apontada printf(" -> Apos executar '*ponteiro = 250', valorOriginal agora vale: %d\n\n", valorOriginal); // 3. PASSAGEM DE PARÂMETROS POR REFERÊNCIA (FUNÇÃO SWAP) int num1 = 10, num2 = 99; printf("[3] Troca de Valores por Referencia (Swap):\n"); printf(" - Antes da troca : num1 = %d, num2 = %d\n", num1, num2); // Passamos o endereço das variáveis com & para a função trocarValores(&num1, &num2); printf(" - Depois da troca: num1 = %d, num2 = %d (Sucesso!)\n\n", num1, num2); // 4. ARITMÉTICA BÁSICA DE PONTEIROS EM VETORES int vetor[3] = {10, 20, 30}; int *ptrVetor = vetor; // O nome do vetor já é o ponteiro para o 1º elemento printf("[4] Vetor percorrido via Aritmetica de Ponteiros:\n"); for (int i = 0; i < 3; i++) { printf(" - Endereco: %p | Valor: %d\n", (void*)(ptrVetor + i), *(ptrVetor + i)); } return 0; } /** * Troca os conteúdos das variáveis originais através de seus ponteiros. */ void trocarValores(int *ptrA, int *ptrB) { int temporario = *ptrA; // Guarda o valor do primeiro *ptrA = *ptrB; // Primeiro recebe o valor do segundo *ptrB = temporario; // Segundo recebe o valor guardado }