> [!NOTE] Ponteiros
> Em programação, um ponteiro é um tipo de dado cujo valor se refere diretamente a outro valor armazenado em uma área da memória, através de seu endereço [^1]. Essencialmente, um ponteiro "aponta" para a localização de outro dado na memória. É uma implementação fundamental do conceito de referência em ciência da computação.
# Como os Ponteiros Funcionam
Ponteiros são cruciais para o gerenciamento de memória e para operações de baixo nível em muitas linguagens de programação.
1. **Endereço de Memória**: O valor de um ponteiro é um endereço de memória. Ao "desreferenciar" um ponteiro, você acessa o valor armazenado naquele endereço.
2. **Alocação de Memória**: Em contextos de [[Alocação de memória]] dinâmica, como a [[Heap na alocação de memória|alocação no heap]], quando você solicita espaço na memória, o sistema retorna um ponteiro para o início desse bloco de memória alocado [^2]. Isso permite que o programa acesse e manipule os dados armazenados ali.
## Ponteiros em C
A linguagem [[Linguagem de programação C|C]] faz uso extensivo de ponteiros, permitindo um controle preciso sobre a memória.
**Exemplo de Declaração e Uso em C**:
Em C, um ponteiro é declarado com um asterisco (`*`) e o endereço de uma variável é obtido com o operador `&`.
```c
#include <stdio.h>
int main(void) {
int n = 50;
// *p é um ponteiro chamado p que aponta para o endereço de n.
int *p = &n;
// imprime o que estiver no endereço para o qual p aponta (o valor de n).
printf("%i", *p); // Saída: 50
}
```
**Aritmética de Ponteiros**:
É possível realizar operações matemáticas simples com ponteiros, como adição e subtração. Isso é particularmente útil para navegar em estruturas de dados contíguas na memória, como arrays [^4].
```c
#include <stdio.h>
int main (void) {
char *s = "hi!"; // s é um ponteiro para o primeiro caractere da string "hi!"
printf ("%c", *s); // Saída: h
printf ("%c", *(s+1)); // Saída: i (acessa o próximo caractere)
printf ("%c\n", *(s+2)); // Saída: ! (acessa o caractere seguinte)
}
```
## Ponteiros em Python (Referências)
Em [[Linguagem de programação Python|Python]], as variáveis funcionam como referências (ou "ponteiros") para objetos na memória. Quando você atribui um valor a uma variável, ela passa a apontar para aquele objeto. Se você atribui um novo valor, ela pode passar a apontar para um novo objeto [^5].
```python
lista_a = [1, 2, 3]
lista_b = lista_a # lista_b agora referencia o MESMO objeto que lista_a
lista_b.append(4)
print(lista_a) # Saída: [1, 2, 3, 4] - Ambos foram alterados porque apontam para o mesmo objeto.
lista_c = [5, 6, 7]
lista_d = lista_c[:] # Cria uma CÓPIA do objeto, não uma referência ao mesmo objeto.
lista_d.append(8)
print(lista_c) # Saída: [5, 6, 7] - lista_c não foi alterada.
print(lista_d) # Saída: [5, 6, 7, 8]
```
### Ver também
- [[Aritmética de ponteiros]]
- [[Exemplo de ponteiros em C]]
- [[Linguagem de programação C]]
- [[Alocação de memória]]
- [[Heap na alocação de memória]]
- [[Variáveis em Python]]
- [[MdC - Programação]]