 Funciones, Arreglos y Dos Punteros
Funciones, 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
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
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
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
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
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.
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
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 Funciones, Arreglos y Dos Punteros
Funciones, 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
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
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
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
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
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.
¡Gracias por tus comentarios!