viernes, 16 de mayo de 2025

03.- Programación I - Apuntadores y Memoria

La siguiente publicación es sobre el uso de apuntadores, la misma contiene tres (3) programas. Copie y ejecute el primer programa, posteriormente compare los programas 2 y 3. El nro. 2 se elaboró sin el uso de apuntadores. El nro. 3 es el mismo programa con el uso de apuntadores



/* Programa Nro 1 muestra el uso del ampersen & y el * con el

manejo de Punteros

Elaborado por Carlos Ferrer*/


#include<iostream>

using namespace std;


main()

{

    int valor=14;

    int *apuntador;


cout <<"    *************** Manejo de memoria *******************                       Pag 1 de 5"<<endl<<endl;

cout <<"    El ampersand (&) es un operador de C++ y es comunmente"<<endl; 

cout <<"    utilizado. Este operador nos permite obtener la direccion"<<endl; 

cout <<"    de memoria de una variable cualquiera y es justo esto"<<endl; 

cout <<"    (la direccion en memoria) es lo que utilizan los programas"<<endl; 

cout <<"    para almacenar los datos o sea los valores asignados a las"<<endl;  

cout <<"    variables"<<endl<<endl; 

cout <<"    Veamos un ejemplo:"<<endl;

cout <<"    Declaremos una variable entera y asignemosle el numero 14=>"<<endl<<endl;

cout <<"                 int valor=14"<<endl<<endl;

cout <<"    Ahora procedamos a imprimir en pantalla la posicion de"<<endl;

cout <<"    memoria, para esto usamos:"<<endl<<endl;

cout <<"                 cout<<&valor;"<<endl<<endl;

cout <<"    El resultado es el siguiente:"<<endl<<endl;

cout<<"                 "<<&valor<<endl<<endl;

cout <<"    En consecuencia en la posicion de memoria "<<&valor<<endl;

cout <<"    es donde esta guardado el numero 14 "<<endl<<endl;

cout <<"    . . . ";

system ("pause");

system ("cls");


cout <<"    *************** Apuntadores *******************                             Pag 2 de 5"<<endl<<endl;

cout <<"    El asterisco (*) es el operador por excelencia"<<endl; 

cout <<"    de los punteros. Su utilidad radica en que si"<<endl; 

cout <<"    el valor de dicho apuntador corresponde a una"<<endl; 

cout <<"    direccion de memoria, el asterisco nos permite"<<endl; 

cout <<"    acceder al valor almacenado alli."<<endl<<endl; 

cout <<"    Viendolo desde otro enfoque, un apuntador permite"<<endl; 

cout <<"    extraer el valor almacenado en una direccion de memoria."<<endl<<endl;

cout <<"    IMPORTANTE: Los apuntadores deben ser del mismo tipo"<<endl; 

cout <<"    que el dato que se desea apuntar."<<endl<<endl; 


cout <<"    Veamos un ejemplo:"<<endl;

cout <<"    Declaremos un apuntador del tipo entero=>"<<endl<<endl;

cout <<"                 int *apuntador"<<endl<<endl;

cout <<"    Ahora hagamos que el apuntador contenga una"<<endl;

cout <<"    posicion de memoria, para esto usaremos el & =>"<<endl<<endl;

cout <<"                 apuntador=&valor"<<endl<<endl;

cout <<"    . . . ";

system ("pause");

system ("cls");

cout <<"    Si imprimimos la variable apuntador                                         Pag 3 de 5"<<endl<<endl; 

cout <<"    cout <<apuntador;"<<endl<<endl; 

cout <<"    que dato esperas que aparezca en pantalla:"<<endl<<endl;

cout <<"    a) La posicion de memoria que donde esta el numero 14 "<<endl; 

cout <<"    b) El numero 14 "<<endl<<endl; 


cout <<"    . . . ";

system ("pause");

system ("cls");


cout <<"    *************** RESPUESTA *******************                               Pag 4 de 5"<<endl<<endl;

cout <<"    Si imprimimos la variable apuntador"<<endl<<endl; 

cout <<"    cout <<apuntador;"<<endl<<endl; 

cout <<"    que dato esperas que aparezca en pantalla:"<<endl<<endl;

cout <<"    Opcion A=>"<<endl<<endl;

apuntador=&valor;

cout <<"    La posicion de memoria que donde esta el numero 14 "<<endl<<endl;

cout <<"                    "<<apuntador<<endl<<endl;  

cout <<"    . . . ";

system ("pause");

system ("cls"); 

cout <<"    Si queremos imprimir el valor de la posicion de memoria                     Pag 5 de 5"<<endl;  

cout <<"    corresponde usar el operador *"<<endl<<endl;  

cout <<"    para imprimir el dato de la posicion de memoria debemos"<<endl;

cout <<"    cambiar => cout <<apuntador;"<<endl; 

cout <<"        por => cout <<*apuntador;"<<endl<<endl; 

cout <<"            El resultado sera = "<<*apuntador<<endl<<endl; 


cout <<"                EXITO!!!!"<<endl<<endl;  

system ("pause");

}

--------------------------------------------------------------------

Programa Nro2

/*Este programa contabiliza la cantidad de letras A dentro de 

una cadena de caracteres sin el uso de punteros*/

#include<iostream>

using namespace std;

string texto;

main()

{

int i;

int contador=0;

cout <<"ingrese la cadena de caracteres"<<endl;

getline(cin, texto);

for (i=0;i<=29;i=i+1)

         {

if(texto[i]=='A' or texto[i]=='a')

            {

    contador=contador+1;

            }

                }


cout <<"Tu cadena de caracteres tiene la cantidad de "<<contador<< " letras A"<<endl;

system("pause");

}

-------------------------------------------------------------------

Programa Nro3

/*Este programa contabiliza la cantidad de letras A dentro de 

una cadena de caracteres usando punteros*/


#include<iostream>

using namespace std;

string texto;

main()

{

int contador;

char *puntero;

cout <<"ingrese la cadena de caracteres (1 palabra)"<<endl;

getline(cin, texto);

puntero=&texto[0];

while(*puntero)

{

if(*puntero=='A' or *puntero=='a')

         {

contador=contador+1;

        }

puntero=puntero+1;

}

cout <<"Tu cadena de caracteres tiene la cantidad de "<<contador<< " letras A"<<endl;

system("pause");

}

-------------------------------------------------------------------

Programa Nro4

Otro ejemplo veamos un programa que le envía dos arreglos a una función y este le retorna el valor máximo y mínimo contenido en cada arreglo (usando punteros).


#include<iostream>

using namespace std;


void funcion_unica (double aux1[],double aux2[],int aux1_largo,int aux2_largo,double *a1_min,double *a1_max,double *a2_min,double *a2_max)

{

double aux1_max,aux1_min,aux2_max,aux2_min;

int i;

aux1_max=aux1[0];

aux2_max=aux2[0];

aux1_min=aux1[0];

aux2_min=aux2[0];

for (i=1;i<aux1_largo;i=i+1)

{

if(aux1[i]>aux1_max)

{

aux1_max=aux1[i];

}

if(aux1[i]<aux1_min)

{

aux1_min=aux1[i];

}

*a1_min=aux1_min;

*a1_max=aux1_max;

}

for (i=1;i<aux2_largo;i=i+1)

{

if(aux2[i]>aux2_max)

{

aux2_max=aux2[i];

}

if(aux2[i]<aux2_min)

{

aux2_min=aux2[i];

}

}

*a2_min=aux2_min;

*a2_max=aux2_max;

}

main()

{

double a1[]={12,13,14,15,1,2,1,6,7,8,9,0,12};

double a2[]={1,-23,3.2,4,5,6,7,8,9,12,12,1,0,34,23};

double min_a1,max_a1,min_a2,max_a2;

    int largo_a1, largo_a2;

     largo_a1=sizeof(a1)/sizeof(a1[0]);

largo_a2=sizeof(a2)/sizeof(a2[0]);

funcion_unica(a1,a2,largo_a1,largo_a2,&min_a1,&max_a1,&min_a2,&max_a2);

cout<<min_a1<<endl;

cout<<max_a1<<endl;

cout<<min_a2<<endl;

cout<<max_a2<<endl;


}

No hay comentarios.:

Publicar un comentario