• Jobs
  • About Us
  • professionals
    • Home
    • Jobs
    • Courses and challenges
    • Questions
    • Teachers
  • business
    • Home
    • Post vacancy
    • Our process
    • Pricing
    • Assessments
    • Payroll
    • Blog
    • Sales
    • Salary Calculator

0

144
Views
¿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!

about 3 years ago · Santiago Trujillo
2 answers
Answer question

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.

about 3 years ago · Santiago Trujillo Report

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!

about 3 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 Our process Sales
Legal
Terms and conditions Privacy policy
© 2025 PeakU Inc. All Rights Reserved.

Andres GPT

Recommend me some offers
I have an error