Pointers: &, *, and pass-by-pointer · Punteros: &, *, y paso por puntero
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.
Un problema de la lección anterior
- En la lección anterior, una función recibía una copia de tu número. Cambiar esa copia no afectaba al valor original.
- C copia cada argumento que pasas a una función. Por eso, una función normal no puede modificar tu variable.
- Para poder modificarla, la función necesita el direccional de la variable —es decir, dónde se encuentra en memoria.
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".
Cada variable tiene una dirección
- Piensa en una variable como una caja en la memoria. El valor se guarda dentro de esa caja.
- Cada caja tiene una direccional: un número que indica dónde está la caja.
- El operador
&te proporciona esa dirección.&xsignifica "la dirección 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.
Un puntero almacena una dirección
- Un puntero es una variable que almacena una direccional, no un valor normal.
- Se declara con un
*:int *p = &x;se lee como "papunta ax". - Para acceder al valor en esa dirección, coloca un
*delante:*p. Esto se llama desreferenciar. - Modificar
*pcambia la variable original.*p = 5;coloca el valor5directamente enx.
#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: devolver más de un resultado
- Una función solo puede
returnun valor. Sin embargo, puede modificar varias variables a través de punteros. - Pasas la direccional de cada resultado, como
find(&min, &max). La función escribe en ellas usando*. - Estos parámetros adicionales de tipo puntero se llaman out-pointers. Quien llama a la función lee los resultados después de la llamada.
- Un puntero que no apunta a nada es
NULL. Nunca desreferencies un punteroNULL.
Common mistakes
&xis the address ofx;*pis the value stored atp.- Never use
*pon an uninitialised orNULLpointer.
Errores comunes
&xes la dirección dex;*pes el valor almacenado en la dirección a la que apuntap.- Nunca uses
*psobre un puntero sin inicializar oNULL.
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.
Ahora te toca a ti
- Cada tarea te ofrece una función para completar. Usa
*para leer o modificar el valor al que apunta el puntero. - Cuando un valor entre a través de un puntero (como
int *p), escríbelo a través de él —no lo devuelvas conreturn. - No escribas una función
main—el validador proporcionará una. Pulsa Run (Ejecutar) y luego Check answer (Comprobar respuesta).
Complete void add_one(int *p) so it adds 1 to the int that p points at. Use *p. Do not · no write a main — the checker provides one. · Complete void add_one(int *p) para que sume 1 al entero al que apunta p. Use *p. No escriba un main — el verificador proporciona uno.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
Complete void swap(int *a, int *b) so it exchanges the two ints. Use a temporary variable. Do not · no write a main. · Complete void swap(int *a, int *b) para que intercambie los dos enteros. Use una variable temporal. No escriba un main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
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 · no write a main. · Complete void min_max(const int a[], int n, int *min_out, int *max_out). Recorra el arreglo, luego escriba el valor más pequeño a través de min_out y el más grande a través de max_out. Asumir que n >= 1. No escriba un main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.