C/Visual C - Duda con los punteros en C

 
Vista:
Imágen de perfil de William Atef
Val: 19
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con los punteros en C

Publicado por William Atef (11 intervenciones) el 14/04/2020 03:33:53
Hola buenas. Tengo una duda sobre los punteros en C. Se que esta pregunta es un tanto típica entre novatillos de C pero aún no he encontrado una explicación que me cuadre del todo. Allá va:

Si yo hago lo siguiente:
1
2
int numero = 9;
int * puntero = №
la variable puntero es entonces un puntero que apunta hacia la posición en memoria que almacena la variable numero. Hasta aquí todo OK.

Si yo hago lo siguiente:
1
char * palabra = "hola";
Estoy declarando un puntero, eso está claro, y que además está apuntando a una posición en memoria que alberga a un char. La pregunta es: porque yo puedo asignarle al puntero "hola" directamente? Si yo hiciese lo mismo con
1
int * puntero
, y le asignase por ejemplo 10, estaría diciendo que hay una posición en memoria con el valor de 10 (estaría diciendo que en una posición de memoria (10 en hexadecimal en ese caso) se alberga un valor int).


El resumen de mi pregunta es: porque al asignarle a un puntero char una string, lo que se le asigna realmente es la posición en memoria del primer char (lo que quiere decir que a parte del puntero, también se crea el string en la memoria) y al crear un puntero int y asignarle cualquier cosa, se le asigna como posición de memoria a la que apunta directamente el número que tu escribes y no sucede igual que con char.


Muchas gracias y un saludo. William
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con los punteros en C

Publicado por Rodrigo (119 intervenciones) el 14/04/2020 08:45:30
No entendi bien la duda que tienes, pues la explicacion que das parece estar bien.

Los punteros guardan direcciones de memoria y como tales puedes asignarle direcciones tomadas de una variable (de la direccion de ella), como en tu primer ejemplo, de lo que retorna malloc o similar, memoria estatica, como lo haces con el string literal, y puedes hacer una asignacion explicita, como lo haces en tu ultimo ejemplo.

Algunas arquitecturas de computadores exigen que los datos esten en posiciones de memoria especificas, por ejemplo multiplos de 2 o multiplos de 4, etc. De este modo, aunque puedes asignar a un puntero un cierto numero, como 9, es posible que tengas problemas al desreferenciarlo, y el programa te "castigue" invocando el error que se llama "bus error". Puedes lograr este problema de otras maneras tambien, pero no va al caso.

No se si esto confunde mas, aporta nada, etc. lo que quiero decir es que no entendi exactamente donde esta tu duda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de William Atef
Val: 19
Ha disminuido 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con los punteros en C

Publicado por William Atef (11 intervenciones) el 14/04/2020 17:19:51
Hola. Gracias por tu respuesta. Mi duda es porque se puede hacer :
1
char * string = "hola"
y no:
1
int * numero = 9
Es algo del compilador? Es decir, el compilador al ver que le asigno al punter un valor de "hola" sabe que realmente el puntero en si tiene otro valor y almacena "hola" en la memoria y la posición del primer caracter la almacena en el puntero. Es así como funciona?
Un saludo y gracias :)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 350
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Duda con los punteros en C

Publicado por Rodrigo (119 intervenciones) el 14/04/2020 23:03:55
Si se puede asignar, pero el compilador va a estar mas feliz si le explicitas que se trata de una direccion de memoria, por ejemplo asi:

1
2
3
4
5
6
7
8
#include <stdio.h>
 
int main() {
    int * p = (int *) 9;
    printf("p tiene %p", p);
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con los punteros en C

Publicado por Tom (619 intervenciones) el 14/04/2020 11:53:35
Porque el tipo de dato de 10 es un int (o mejor, un long) y el tipo de dato de "hola" es un char* (o un const char*).
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

Duda con los punteros en C

Publicado por Nacho (76 intervenciones) el 14/04/2020 14:28:39
¿Preguntas por qué se puede poner char* palabra = "hola" y no int* puntero = 9?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Duda con los punteros en C

Publicado por Nacho (76 intervenciones) el 14/04/2020 18:02:12
Esas dudas las resuelve siempre ver el desensamblado.

1
2
3
4
5
6
7
8
int numero = 9;
00007FF68CEFE036  mov         dword ptr [numero],9
	int* puntero = &numero;
00007FF68CEFE03D  lea         rax,[numero]
00007FF68CEFE041  mov         qword ptr [puntero],rax
	char* palabra = "hola";
00007FF68CEFE045  lea         rax,[string "hola" (07FF68CF0D024h)]
00007FF68CEFE04C  mov         qword ptr [palabra],rax

int numero = 9 genera un código distinto a int* puntero = &numero que sí es igual a char* palabra = "hola".
"hola" se almacena en la pila y lo que hace char* palabra = "hola" es poner en el puntero palabra el valor del puntero donde está "hola". O sea, char* palabra y "hola" son dos punteros cuando se ejecuta el programa, y asignas a uno el valor del otro. 9 en ningún momento es un int* así que no puedes asignarlo a int* puntero.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar