Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

196
Vistas
¿Cómo hacer que una variable apunte a otra región de memoria?

Estoy aprendiendo C del libro "Effective C" de Robert C. Seacord, y hay una introducción a los punteros y la llamada por valor frente a la llamada por referencia escribiendo una función que intercambia los valores de las variables (llamada swap ). El resultado final es:

 #include <stdio.h> void swap(int *pa, int *pb) { int t = *pa; *pa = *pb; *pb = t; } int main(void) { int a = 21; int b = 17; swap(&a, &b); printf("a = %d, b = %d\n", a, b); return 0; }

Todo esto está bien y claramente explicado, pero después de leer esta parte,

 *pa = *pb;

Esto elimina la referencia del puntero pb , lee el valor al que se hace referencia, elimina la referencia al puntero pa y luego sobrescribe el valor en la ubicación a la que hace referencia pa con el valor al que hace referencia pb .

Empecé a pensar: ¿sería posible hacer que la a apunte al rango de memoria que contiene el valor señalado por la variable b (y viceversa) en lugar de sobrescribir los rangos de memoria de a y b ?

Al menos, según lo poco que sé, " en C, las variables son nombres legibles por humanos para las direcciones de memoria de la computadora utilizadas por un programa en ejecución ". Entiendo que este es un ejemplo artificial (que también se encuentra en muchos otros tutoriales), pero aún me pregunto si la sobrescritura de rangos de direcciones es un desperdicio/ineficiente.


Intenté buscar esto en Google pero seguí obteniendo resultados irrelevantes; probablemente porque no estaba usando los términos correctos... Probablemente encontraría la respuesta en un par de semanas, pero tuve que poner esto por escrito ya que me estaba royendo constantemente. ¡Gracias!

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Las declaraciones int a = 21; e int b = 17; Defina los símbolos a y b . En el modelo de computación C, hacen que la memoria se reserve para representar valores int y crean nombres a y b para esa memoria (y más que solo la memoria, también la semántica que viene con el objeto creado por la definición, incluida su tipo).

Esta vinculación del nombre a la memoria designada es una parte intrínseca de una definición en C, para definiciones de identificadores de objetos. El estándar C no proporciona ningún mecanismo mediante el cual se pueda cambiar el nombre a para hacer referencia a la memoria asignada para b o viceversa.

over 4 years ago · Santiago Trujillo Denunciar

0

No, no es posible. a y b son nombres en tiempo de compilación para regiones de memoria . No puede convertir una región de memoria en una región de memoria diferente.

Después de compilar el código, se parece más a esto:

 int main(void) { allocate_local_variables(8); *(int*)(local_variables + 0) = 21; *(int*)(local_variables + 4) = 17; swap(local_variables + 0, local_variables + 4); printf("a = %d, b = %d\n", *(int*)(local_variables + 0), *(int*)(local_variables + 4)); return 0; }

y su pregunta es: "¿Puedo hacer que local_variables + 0 apunte a local_variables + 4 ?" lo cual es claramente una tontería.

Tal vez haya una manera de hacer que el compilador comience a escribir local_variables + 4 en lugar de local_variables + 0 cuando el programa dice a , pero no creo que haya ninguna. Incluso si lo hay, no haría lo que se supone que debe hacer una función de intercambio, ya que el compilador solo haría esto dentro de una determinada sección del código. Si funcionara de esta manera, no podría hacer if(random_number() < 5) swap(&a, &b); ¡porque el compilador no sabría si intercambiarlos o no!

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda