Esta clase ha sido complicada. Dejo mi resumen por si a alguien le es útil:
Te falto hacer que el puntero apunte a la dirección en memoria de la variable number, si no lo haces el código retornaría null, hay que recordar que para obtener la dirección en memoria de una variable; escribimos &mivariable
Entonces en este caso escribiríamos &number
También hay algunos pequeños errores de sintaxis pero bueno, siempre se nos pueden escapar o quizás los obviaste porque sólo es un apunte
De todas maneras acá dejo la correción de tu código
int main(){int number =10;int * pointToNumber =&number;printf("%p, %d", pointToNumber,*pointToNumber);return0;}
Me gusta tu herramienta para apuntes ¿Me la puedes compartir?
¡Uy si! Se me escapaó ese detalle. Mil gracias. También corregí los de sintaxis jaja.
Tal cual, como es un apunte por ahí me concentro en tomar los conceptos más generales.
Lo que uso es OneNote, muy buena herramienta. De paso te dejo un link con algunos tips que sirven para iniciarse a usarla.
https://www.youtube.com/watch?v=SUu8cZzKewM
Gracias por el aporte
Gracias Hector, resumido el capitulo.
Este tema es clave para entender C, se debe prestar mucha atención.
Nunca entendí esta clase en la Universidad, espero me sorprenda profesor,
@gydoar Ojalá que sí! Cualquier duda puedes dejar tu pregunta!
el curso esta muy flojo, tenie en varios videos errores de codigo que no llega a suceder por mera casualidad como setea las variables, ademas de que aplica muchas malas practicas, se que es introductorio, pero veo que es mas para alguien que ya sabe low-level con otro lenguaje y quiere rapidamente ver como se hace en C
Se, yo lo estoy viendo en la facultad, no pone ni habla sobre los prototipos de función, no usa el return 0 en el main . La clase de funciones son 3 min, muy corta apenas ejemplifica una tipo de función con retorno entero. Son de los ultimos cursos que voy hacer. Hay mucho relleno. Hize 3 cursos de python y literal en los 3 habia muchas clases explicando lo mismo y no incluia nada nueevo. Obviamente no se puede esperar el mejor contenido del mundo si comparas el precio de estos cursos con otro pero bueno. No cuesta mucho hacer un video de más de 3 min explicando varios tipos de funciones.
Organizacion de la memoria: La memoria se organiza en forma de celdas, por medio de bytes, como por ejemplo podemos tener una representacion de esta forma, donde cada cerda representa un byte, lo cual dentro de ella son 8 bits
--> Esto lo que significa es que dentro de una celda podemos guardar un valor numerico como maximo de 255, y si queremos guardar un valor numerico mas grande tendremos que utilizar otro Byte. Entonces cada vez que tengamos que agregar un valor numerico mas grande vamos a estar necesitando abarcar mas celdas, para almacenar su valor.Direcciones de memoria: Son predefinidas, con notacion hexadecimal, lo que quiere decir que son cantidades tan grandes que se necesita utilzarlo.
--> Entonces cuando estamos asignando una variable, lo que realmente estamos es asignando un nombre, un nombre que es mas facil de recordar que una direccion exadecimal y su valor es el que se encontrara dentro de la celda.nil: Significa null o nuloPunteros: Su funcion es buscar un espacio de memoria donde estan las variables, puesto que si buscamos o intentamos ingresar a una variable equivocada o que siquiera existe vamos a tener error en el codigo, los punteros solamente pueden manejar espacio de memoria lo que quiere decir que no manejaran otro tipo de variable.--> Lo que quiere decir que al momento de crear una variable de tipo puntero, su contenido sera unicamente la direccion de la variable asignada. --> Una de las formas de encontrar la direccion en memoria de una variable es de la siguiente forma:
*&+ la variable -->&x
--> Esto lo podemos escribir en un prinft, dentro de ella de la siguiente forma:#include <stdio.h>int main (){ int x = 10, z; printf("El valor de x es: %d\n", x); printf("Su direccion es: %d\n", &x); return 0;}IMPORTANTE lo tenemos que hacer con %u, para que la direccion no salga con valores positivos o negativos, entonces quedaria asi:
printf("Su direccion es: %u\n", &x);
--> Entonces con esto, tenemos que la variable x se almacena en esa direccion de nuestra memoria del ordenadorGuardar direccion con puntero: Si queremos guardar la direccion de memoria donde se almacena la variable para ello lo tenemos que hacer con el puntero, para ello lo que tenemos que hacer es lo siguiente:
* int*--> declaramos el tipo de variable y le agregamos
enseguida un * esto lo que indicara que es una variable de direccion de memoria.
* int*+ nombre de la variable "direct"=&x;
--> entonces la variable direct de tipo direccion de memoria es la que va a encerrar la direccion de memoria de la variable X. Esto es lo que se le llama puntero
IMPORTANTE Funciona con cualquier otro tipo de variable puede ser variable de tipo floatUso del puntero: El principal uso que tienen los punteros en el lenguaje C, es trabajar con referencias en las funciones, lo que quiere decir, que cuando por ejemplo estamos pasandole una variable a una funcion, lo que realmente le estamos pasando es una copia, por ejemplo tenemos el siguiente ejemplo de codigo:
#include <stdio.h>
void jugar (int n){ n = n + 5; printf("vale: %d\n", n);}int main (){ int x = 10; jugar(x); printf("valez: %d\n", x);}
--> Entonces una vez que termina la funcion esa copia muere, ya no tiene mas relevancia en el codigo puesto que las funcion se cumple cuando hasta que sea necesaria
IMPORTANTE Cuando trabajamos con puntero, trabajamos con direcciones en memoria y no con variables
Recuperar el valor de puntero: Para ello tenemos que declarar un * antes des de una variable, de forma que se recuperara la direccion de la variable:
* int y =*n;
--> Entonces, para cambiar el valor de la celda lo hacemos de la siguiente forma:
#include <stdio.h>
void jugar (int* n)
{
int y = *n;
y = y + 5 * 3 - 1;
*n = y;
//printf("direccion es: %u\n", y);
}
int main ()
{
int x = 10;
jugar(&x);
printf("valez: %d\n", x);
return 0;
}
--> Entonces con esto lo que estamos haciendo, es cambiarle el valor a la direccion, que la direccion se guarda en *n, con la recuperacion, es decir la sustituye, entonces ya no seria la anterior sino en este caso la direccion de x, seria el resultado de la ecuacion.
Gracias Platzi por que puedo volver aqui y ver la clase de nuevo, estando adelante en el curso en un a clase de los string y me perdi con la definicion de los punteros, solo volvi aqui y ya lo aclare.
¿Cuál es el uso de &? ¿Qué función tiene cuando se usa junto con el nombre de una variable?
El ampersand (&) significa indicar la dirección en memoria de la variable, enviando el valor por referencia.
Por lo tanto es enviar una variable por paso por referencia en lugar de por valor.
El & tambien se usa con el scanf para indicar a que variable va a pertenecer el valor que el scanf escaneo. Como en el siguiente ejemplo.
int main(void){ int numero;printf("Ingresa un numero random: ");scanf("%i",&numero);return0;}```
No hay algo mas dificil de manejar que punteros en C, segun asi lo ruerdo en la universidad, pero esta explicacion es muy facil de asimilar
Este prógrama que hice me ayudo a enternderlo un poco mejor
#include <stdlib.h>#include <stdio.h>int main(){//Declaracion de variables int x =45; int *puntero;printf("\nDIRECCION del puntero : %p",puntero);printf("\nDIRECCION de la variable: %p",&x);printf("\nVALOR DEL PUNTERO : %i",*puntero);printf("\nVALOR DE LA VARIABLE: %i",x);//Apuntar a la direccion de la variable puntero =&x;//Entrada de datos printf("\n\nDigite un numero: ");scanf("%i",puntero);//camiar el valor de la variable x con punteros*puntero = x;printf("\nDIRECCION del puntero : %p",puntero);printf("\nDIRECCION de la variable: %p",&x);printf("\nVALOR DEL PUNTERO : %i",*puntero);printf("\nVALOR DE LA VARIABLE: %i\n",x);return0;}
A que se refiere cuando dice que " La concecuencia de agragar mas bytes tiene como resultado agregar numeros mas grandes pero a la vez menos cantidad de esos numeros" suena un poco contradictorio.
Se refiere a que el numero en cuestión puede ocupar un gran espacio, ejemplo:
Pero estas utilizando muy pocos números grandes, ósea estas utilizando mas de lo que necesitas para abarcar todos tus numeros
Debemos recordar la equivalencia en binario de cada numero y también que 8 bits forman un byte, el máximo número alcanzable con un byte es : 11111111 lo que es equivalente a 255, entonces si queremos expresar números > a 255 tendremos que ocupar mas de un byte, por ejemplo : 300 a binario seria 0000000100101100 lo cual ocupa 2 bytes de información, usualmente se eliminan los ceros de enfrente porque se sobre entiende que ahí están.
No entendí la parte de representar números mas grandes pero en menor cantidad
Se refiere a que la memoria puede almacenar números grandes y eso necesitara más celdas de memoria, entonces vamos a poder almacenar pocos de esos números grandes. Quizá ésta analogía te funcione, imagina que hay un autobús (es la memoria) y pueden ir 20 personas sentadas en asientos, cada persona ocupa un solo asiento (números pequeños), pero llegan personas más grandes que necesitan 2 asientos cada una (números grandes), y entonces ya no podrías llevar a 20 pasajeros sino a 10 porque necesitan 2 asientos cada una. :)
Si tienes una memoria de 8 bytes y tu número está entre 0 y 255 (es decir solo necesitas un byte) podrás almacenar 8 números diferentes, sin embargo si tu número es mayor (al menos necesitarás 2 bytes) entonces solo podrás almacenar 4
Dependiendo del tamaño de tu número es la cantidad de bytes necesarios para almacenarlo
Asi que no entendiste!....lo se ...no te preocupes...te Dejo por aca este excelente aporte de la Dra Teresa Alarcón la cual explica extremandamente bien y de forma sencilla el tema de los punteros, para aquellos que quedaron con alguna duda
https://www.youtube.com/watch?v=nmevgUlakik
De hecho sí entendí salvo por la parte de la desreferenciación, volví a ver el video y ya me quedó el concepto claro.
una pregunta por que me sale este error.:

Me exploto la cabeza pero logre, aprender un poco mas de los punteros
Que clase tan genial, cada día se aprende algo nuevo.
{ int numero1=20; int * punteroNumero1=&numero1;printf("variable numero1 antes de ser modificada por el puntero:%d\n", numero1);*punteroNumero1=30;printf("variable numero1 después de ser modificada por el puntero:%d\n", numero1);return0;}
Este es el resultado:
Hice este código
#include <stdio.h>int main(){ int number; int * pointToNumber;printf("(%p)\n", pointToNumber );}
Me dió ese resultado y no el nulo
(0000002F)
Formatea el computador ajjaja no tiene sentido que te de una dirección de memoria.
¿Por qué encerraste %p entre paréntesis?
por que pone int main() en lugar de main solo?
Porque se especifica el tipo de dato que retorna la función main. Si no optamos por no poner int main(); se puede cambiar por void main(). Pero al final no se debe de incluir el return. :)
Pero el return es escencial para devolver el código de error