Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprende Funciones, Arreglos y Dos Punteros | Punteros
Fundamentos de C

bookFunciones, Arreglos y Dos Punteros

Funciones con punteros

Experimentemos con una función básica para modificar el valor de nuestros datos. Por ejemplo, imagina que necesitas una función que convierta kilo-Ohmios a Ohmios (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Un intento de cambiar el valor de la variable r no tuvo éxito. Esto se debe a que la función recibe una copia de la variable r, no el valor real en sí.

Para que nuestro programa funcione como se espera, es necesario pasar la dirección de la variable r a la función. Como resultado, la función Ohm debe aceptar double* en lugar de solo double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Observe que se hace referencia a la variable r dos veces. Después de invocar la función Ohm, el valor de r es modificado. Esto ocurre porque la función recibió la dirección original de la variable r, no solo una copia, y luego modificó el valor en esa dirección específica.

Además, una función puede devolver un puntero a un objeto que ha generado:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Cuando se suma un número (pX + 1) a una dirección, se obtiene la dirección de la siguiente celda de memoria. Escribamos un bucle para recorrer la "secuencia" de la RAM:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Se han proyectado tres pasos hacia adelante. Es evidente a partir de las direcciones derivadas que existe una jerarquía clara.

Un arreglo es esencialmente una dirección fija (representada por el nombre del arreglo) junto con la memoria asignada. Los índices de los elementos representan su desplazamiento desde la dirección del elemento inicial.

Esta noción puede validarse con el siguiente programa:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

No se recorre directamente el arreglo. Únicamente se utiliza su dirección, específicamente la dirección de su elemento inicial.

question mark

¿Qué afirmación explica mejor por qué una función en C puede modificar el valor de una variable cuando se le pasa un puntero a ella, pero no cuando se le pasa la variable en sí?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 6. Capítulo 5

Pregunte a AI

expand

Pregunte a AI

ChatGPT

Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla

Suggested prompts:

Can you explain how passing by address works in more detail?

What are some common mistakes when using pointers in functions?

Can you show an example of pointer arithmetic in a loop?

Awesome!

Completion rate improved to 2.63

bookFunciones, Arreglos y Dos Punteros

Desliza para mostrar el menú

Funciones con punteros

Experimentemos con una función básica para modificar el valor de nuestros datos. Por ejemplo, imagina que necesitas una función que convierta kilo-Ohmios a Ohmios (1 kOhm = 1000 Ohm).

Main.c

Main.c

copy
12345678910111213141516
#include <stdio.h> void Ohm(double R) { R = R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(r); printf("The value of resistance after using function: %f", r); return 0; }

Un intento de cambiar el valor de la variable r no tuvo éxito. Esto se debe a que la función recibe una copia de la variable r, no el valor real en sí.

Para que nuestro programa funcione como se espera, es necesario pasar la dirección de la variable r a la función. Como resultado, la función Ohm debe aceptar double* en lugar de solo double.

Main.c

Main.c

copy
1234567891011121314151617
#include <stdio.h> void Ohm(double* R) { // Dereferencing the entered address and changing the object it points to *R = *R * 1000; } int main() { double r = 1.5; // kOhm printf("The value of resistance before using function: %f\n", r); Ohm(&r); printf("The value of resistance after using function: %f\n", r); return 0; }

Observe que se hace referencia a la variable r dos veces. Después de invocar la función Ohm, el valor de r es modificado. Esto ocurre porque la función recibió la dirección original de la variable r, no solo una copia, y luego modificó el valor en esa dirección específica.

Además, una función puede devolver un puntero a un objeto que ha generado:

Main.c

Main.c

copy
123456789101112131415
#include <stdio.h> #include <stdlib.h> int* func() { int* x = (int*)malloc(sizeof(int)); printf("Address into function: %p\n", x); return x; } int main() { int* pointerToFunc = func(); printf("Address after using function: %p\n", pointerToFunc); return 0; }

Cuando se suma un número (pX + 1) a una dirección, se obtiene la dirección de la siguiente celda de memoria. Escribamos un bucle para recorrer la "secuencia" de la RAM:

Main.c

Main.c

copy
12345678910
#include <stdio.h> int main() { int* pX = NULL; // Pointer to `int` type (4 bites) for (int i = 0; i < 3; i++) printf("Address: %p\n", pX + i); return 0; }

Se han proyectado tres pasos hacia adelante. Es evidente a partir de las direcciones derivadas que existe una jerarquía clara.

Un arreglo es esencialmente una dirección fija (representada por el nombre del arreglo) junto con la memoria asignada. Los índices de los elementos representan su desplazamiento desde la dirección del elemento inicial.

Esta noción puede validarse con el siguiente programa:

Main.c

Main.c

copy
1234567891011
#include <stdio.h> int main() { int array[] = {1,2,3,4,5}; printf("Address of array: %p\n", array); for(int i = 0; i < 5; i++) printf("Value: %d | Address of element with index %d: %p\n", *(array + i), i , &array[i]); return 0; }

No se recorre directamente el arreglo. Únicamente se utiliza su dirección, específicamente la dirección de su elemento inicial.

question mark

¿Qué afirmación explica mejor por qué una función en C puede modificar el valor de una variable cuando se le pasa un puntero a ella, pero no cuando se le pasa la variable en sí?

Select the correct answer

¿Todo estuvo claro?

¿Cómo podemos mejorarlo?

¡Gracias por tus comentarios!

Sección 6. Capítulo 5
some-alt