Nomes de Arrays como Ponteiros
Parte da seção Logic & Flow do Journey de C da Coddy — lição 7 de 63.
Arrays e ponteiros em C têm uma relação especial que é fundamental para entender como o C trabalha com dados na memória. Quando você declara um array, o próprio nome do array atua como um ponteiro constante para o primeiro elemento do array.
Isso significa que quando você tem um array como int numbers[5];, o nome numbers é essencialmente um ponteiro que sempre aponta para numbers[0]. Você pode pensar no nome do array como um ponteiro embutido que você não precisa declarar separadamente.
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' aponta para o primeiro elemento
// numbers == &numbers[0] // Estes são equivalentes!Esta equivalência é crucial: numbers e &numbers[0] ambos fornecem exatamente o mesmo endereço de memória. O nome do array é apenas uma maneira mais conveniente de se referir ao endereço do primeiro elemento sem ter que usar o operador de endereço.
Compreender essa relação abre as portas para o uso de técnicas de ponteiros com arrays, o que pode tornar seu código mais flexível e eficiente. A principal diferença é que, ao contrário dos ponteiros comuns, os nomes de arrays são ponteiros constantes - você não pode alterar para o que eles apontam.
Desafio
FácilEscreva um programa em C que demonstre a equivalência entre nomes de arrays e ponteiros para seus primeiros elementos. Seu programa deve:
- Declarar um array de inteiros chamado
numberscom 4 elementos e inicializá-lo com os valores {10, 20, 30, 40} - Declarar um ponteiro para um inteiro chamado
ptr - Atribuir o nome do array
numbersao ponteiroptr - Imprimir o endereço armazenado em
numbersusandoprintfcom o especificador de formato%p - Imprimir o endereço do primeiro elemento
&numbers[0]usandoprintfcom o especificador de formato%p - Imprimir o endereço armazenado em
ptrusandoprintfcom o especificador de formato%p - Imprimir o valor do primeiro elemento usando o nome do array:
*numbers - Imprimir o valor do primeiro elemento usando o ponteiro:
*ptr
Sua saída deve exibir os resultados no seguinte formato:
Array name address: [address]
First element address: [address]
Pointer address: [address]
Value via array name: 10
Value via pointer: 10Este desafio demonstra que o nome do array atua como um ponteiro constante para o primeiro elemento, e que numbers, &numbers[0] e ptr contêm o mesmo endereço de memória quando ptr recebe o nome do array.
Folha de consulta
Nomes de arrays em C agem como ponteiros constantes para o primeiro elemento do array.
Quando você declara um array, o nome do array aponta para o primeiro elemento:
int numbers[5] = {10, 20, 30, 40, 50};
// 'numbers' aponta para o primeiro elemento
// numbers == &numbers[0] // Estes são equivalentes!Você pode atribuir um nome de array a um ponteiro:
int *ptr;
ptr = numbers; // ptr agora aponta para o primeiro elementoAcesse valores usando a notação de ponteiro:
*numbers // Valor do primeiro elemento via nome do array
*ptr // Valor do primeiro elemento via ponteiroDiferença fundamental: Nomes de arrays são ponteiros constantes - você não pode mudar para onde eles apontam, ao contrário de ponteiros comuns.
Experimente você mesmo
#include <stdio.h>
int main() {
// TODO: Escreva seu código aqui
// 1. Declare e inicialize o array 'numbers' com {10, 20, 30, 40}
// 2. Declare um ponteiro para inteiro chamado 'ptr'
// 3. Atribua o nome do array ao ponteiro
// 4. Imprima todos os endereços e valores necessários
return 0;
}Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Logic & Flow
1Fundamentos de Ponteiros
O que é um Ponteiro?Declarando PonteirosO Operador de Endereço (&)O Operador de Desreferência (*)Ponteiros NULLRecapitulação: Fundamentos de Ponteiros4Projeto: Utilitário de Texto Simples
Visão Geral do ProjetoContando Caracteres2Ponteiros e Arrays
Nomes de Arrays como PonteirosElementos de Array - PonteirosAritmética de PonteirosComparando PonteirosRecapitulação: Percorrendo Arrays com Ponteiros5Ponteiros e Funções
Passagem por ValorPassando Ponteiros para FunçõesModificando Variáveis via PonteirosUm Exemplo Clássico: SwapPassando Arrays para FunçõesRecapitulação: Ponteiros como Argumentos3Arrays de Caracteres e Strings
Strings como Arrays de charO Terminador NuloEntrada de Strings com scanfUsando strlen()Usando strcpy()Usando strcat()Usando strcmp()Recapitulação: Funções Básicas de Strings6Gerenciamento de Memória
Memória Stack vs. HeapAlocação Dinâmica - malloc()Usando sizeof() para AlocaçãoVerificando Falhas de AlocaçãoLiberando Memória com free()Alocando com calloc()Recapitulação: Array Dinâmico9Projeto: Cadastro Simples de Contatos
Projeto: Definir a Struct de ContatoFunção para Criar um Contato