Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

341
Views
En C, ¿por qué no se puede asignar un valor entero a un int* de la misma manera que se puede asignar un valor de cadena a un char*?

He estado buscando en el sitio pero aún no he encontrado una respuesta a esta.

Es más fácil (al menos para mí) explicar esta pregunta con un ejemplo.

No entiendo por qué esto es válido:

 #include <stdio.h> int main(int argc, char* argv[]) { char *mystr = "hello"; }

Pero esto produce una advertencia del compilador ("la inicialización hace que el puntero sea un número entero sin conversión"):

 #include <stdio.h> int main(int argc, char* argv[]) { int *myint = 5; }

Mi comprensión del primer programa es que crea una variable llamada mystr de tipo puntero a carácter, cuyo valor es la dirección del primer carácter ('h') de la cadena literal "hola". En otras palabras, con esta inicialización no solo obtiene el puntero, sino que también define el objeto ("hola" en este caso) al que apunta el puntero.

¿Por qué, entonces, int *myint = 5; aparentemente no lograría algo análogo a esto, es decir, crear una variable llamada myint de tipo pointer-to-int, cuyo valor es la dirección del valor '5'? ¿Por qué esta inicialización no me da el puntero y también define el objeto al que apunta el puntero?

over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

De hecho, puede hacerlo usando un literal compuesto , una característica agregada al lenguaje por el estándar ISO C de 1999.

Un literal de cadena es de tipo char[N] , donde N es la longitud de la cadena más 1. Como cualquier expresión de matriz, se convierte implícitamente, en la mayoría de los contextos, pero no en todos, en un puntero al primer elemento de la matriz. Así que esto:

 char *mystr = "hello";

asigna al puntero mystr la dirección del elemento inicial de una matriz cuyo contenido es "hello" (seguido de un carácter nulo '\0' terminación). Por cierto, es más seguro escribir:

 const char *mystr = "hello";

No existen tales conversiones implícitas para números enteros, pero puede hacer esto:

 int *ptr = &(int){42};

(int){42} es un literal compuesto, que crea un objeto int anónimo inicializado en 42 ; & toma la dirección de ese objeto.

Pero tenga cuidado: la matriz creada por un literal de cadena siempre tiene una duración de almacenamiento estática, pero el objeto creado por un literal compuesto puede tener una duración de almacenamiento estática o automática, según dónde aparezca. Eso significa que si el valor de ptr se devuelve desde una función, el objeto con el valor 42 dejará de existir mientras el puntero siga apuntándolo.

Como para:

 int *myint = 5;

que intenta asignar el valor 5 a un objeto de tipo int* . (Estrictamente hablando, es una inicialización en lugar de una asignación, pero el efecto es el mismo). Dado que no hay una conversión implícita de int a int* (aparte del caso especial de 0 que se trata como una constante de puntero nulo), esto no es válido.

over 4 years ago · Santiago Trujillo Report

0

Cuando haces char* mystr = "foo"; , el compilador creará la cadena "foo" en una parte especial de solo lectura de su ejecutable y reescribirá efectivamente la declaración como char* mystr = address_of_that_string;

No se implementa lo mismo para ningún otro tipo, incluidos los enteros. int* myint = 5; configurará myint para que apunte a la dirección 5 .

over 4 years ago · Santiago Trujillo Report

0

Voy a dividir mi respuesta en dos partes:

Primero, por qué char* str = "hello"; es válida:

char* str declara un espacio para un puntero (número que representa una dirección de memoria en la arquitectura actual)

cuando escribes "hello" , en realidad llenas la pila con 6 bytes de datos
(no olvide la terminación nula) digamos en la dirección 0x1000 - 0x1005 .

str="hello" asigna la dirección de inicio de esos 5 bytes (0x1000) a *str

entonces lo que tenemos es:
1. str , que ocupa 4 bytes en la memoria, contiene el número 0x1000 (¡apunta solo al primer carácter!)
2. 6 bytes 'h' 'e' 'l' 'l' 'o' '\0'

2º, por qué int* ptr = 0x105A4DD9; no es valido:

bueno, esto no es del todo cierto!
como se dijo antes, un Pointer es un número que representa una dirección,
Entonces, ¿por qué no puedo asignar ese número?

no es común porque en su mayoría extrae direcciones de datos y no ingresa la dirección manualmente.
pero puedes si lo necesitas!!! ...
porque no es algo que se haga comúnmente,
el compilador quiere asegurarse de que lo haga en la propuesta, y no por error, y lo obliga a CAST sus datos como
int* ptr = (int*)0x105A4DD9;
(utilizado principalmente para recursos de hardware mapeados en memoria)

Espero que esto aclare las cosas.
Salud

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!