Pointers: &, *, and pass-by-pointer · Ponteiros: &, *, e passed-by-pointer
A problem from last lesson
- Last lesson, a function got a copy of your number. Changing the copy did not change the original.
- C copies every argument you pass to a function. So a normal function cannot change your variable.
- To change it, the function needs the variable's address — where it lives in memory.
Um problema da lição passada
- Na lição passada, uma função recebeu uma cópia do seu número. Alterar a cópia não alterou o original.
- C copia cada argumento que você passa a uma função. Então uma função normal não pode alterar sua variável.
- Para alterá-la, a função precisa do endereço da variável — onde ela reside na memória.
Every variable has an address
- Think of a variable as a box in memory. The value is kept inside the box.
- Every box has an address: a number that says where the box is.
- The
&operator gives you that address.&xmeans "the address ofx".
Toda variável tem um endereço
- Pense em uma variável como uma caixa na memória. O valor fica guardado dentro da caixa.
- Cada caixa tem um endereço: um número que diz onde a caixa está.
- O operador
&fornece esse endereço.&xsignifica "o endereço dex".
A pointer holds an address
- A pointer is a variable that stores an address, not a normal value.
- You declare one with a
*:int *p = &x;reads as "ppoints tox". - To reach the value at that address, put
*in front:*p. This is called dereference. - Changing
*pchanges the original variable.*p = 5;puts5intoxitself.
Um ponteiro armazena um endereço
- Um ponteiro é uma variável que armazena um endereço, não um valor comum.
- Você o declara com um
*:int *p = &x;lê-se como "paponta parax". - Para acessar o valor naquele endereço, coloque
*à frente:*p. Isso é chamado de desreferência. - Alterar
*pmuda a variável original.*p = 5;coloca5diretamente emx.
#include <stdio.h>
void set_to_five(int *p) {
*p = 5; // change the value at the address
}
int main(void) {
int x = 0;
set_to_five(&x); // pass the ADDRESS of x
printf("%d\n", x); // 5 — the original changed!
return 0;
}
Out-pointers: giving back more than one answer
- A function can
returnonly one value. But it can change several variables through pointers. - You pass the address of each answer, like
find(&min, &max). The function writes into them with*. - These extra pointer parameters are called out-pointers. The caller reads the answers after the call.
- A pointer that points to nothing is
NULL. Never dereference aNULLpointer.
Out-pointers: devolvendo mais de uma resposta
- Uma função pode retornar
returnapenas um valor. Mas ela pode alterar várias variáveis por meio de ponteiros. - Você passa o endereço de cada resposta, como
find(&min, &max). A função escreve nelas usando*. - Esses parâmetros de ponteiro extras são chamados out-pointers. O chamador lê as respostas após a chamada.
- Um ponteiro que não aponta para nada é
NULL. Nunca desreferencie um ponteiroNULL.
Common mistakes
&xis the address ofx;*pis the value stored atp.- Never use
*pon an uninitialised orNULLpointer.
Erros comuns
&xé o endereço dex;*pé o valor armazenado emp.- Nunca use
*pem um ponteiro não inicializado ou nulo (NULL).
Now you try
- Each task gives you a function to complete. Use
*to read or change the value the pointer points to. - When a value comes in through a pointer (like
int *p), write your answer through it — do notreturnit. - Do not write a
main— the checker provides one. Press Run, then Check answer.
Agora você tenta
- Cada tarefa oferece uma função para completar. Use
*para ler ou alterar o valor ao qual o ponteiro aponta. - Quando um valor entra através de um ponteiro (como
int *p), escreva sua resposta por meio dele — não retorne (return) ele. - Não escreva um
main— o verificador fornece um. Pressione Executar, depois Verificar resposta.
Complete void add_one(int *p) so it adds 1 to the int that p points at. Use *p. Do not · não write a main — the checker provides one. · Complete void add_one(int *p) para adicionar 1 ao int que p aponta. Use *p. Não escreva um main — o verificador fornece um.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.
Complete void swap(int *a, int *b) so it exchanges the two ints. Use a temporary variable. Do not · não write a main. · Complete void swap(int *a, int *b) para trocar os dois ints. Use uma variável temporária. Não escreva um main.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.
Complete void min_max(const int a[], int n, int *min_out, int *max_out). Scan the array, then write the smallest value through min_out and the largest through max_out. Assume n >= 1. Do not · não write a main. · Complete void min_max(const int a[], int n, int *min_out, int *max_out). Escaneie o array, depois escreva o menor valor através de min_out e o maior através de max_out. Assuma n >= 1. Não escreva um main.
Click Run to see the output here. · Clique em Executar para ver a saída aqui.