Thread: Punteros en c++
View Single Post
gladius
Veteran Member
Join Date: Jul 2008
Location: Santiago, Chile
Old 05-27-2012 , 16:39   Re: Punteros en c++
#10

Los punteros apuntan a una dirección de memoria. No es lo mismo que obtenga el valor a que obtenga la dirección de memoria del valor.

Puedes usar dos operadores básicos dentro de los punteros. &(Direccionamiento) y *(Indireccionamiento)

Sintaxis:

int *ptrA, A;
A = 5;
ptrA = &A; // puntero a la variable A

ptrA es un puntero a int, mientras que la variable A es solo una variable del tipo int.
Todo puntero debe ser precedido por un asterisco (*).
Un puntero si es constante NO PUEDE ser modificado. int *const ptrA = 5; Puede alterarse solo si apunta a una variable y esta se modifica.

Si tengo un puntero A que apunta a la posición X y tengo otro puntero B que apunta a X, si yo modifico el puntero A, el puntero B se va a modificar también. Si yo modifico la variable X, ambos punteros se van a modificar.

Te dejo unos ejemplos hechos por mi, ojalá los entiendas y conozcas alguno de sus usos. (Están hechos en un compilador no muy bueno Dev c++)

Code:
// Operadores Simples

#include <iostream>
using namespace std;

main()
{
      int a = 3, *b = &a;
      
      cout << "a: " << a << endl << "b: " << b << " ( " << *b << " )" << endl;
      
      system("pause");
}
Code:
// Operadores Simples con puntero constante

#include <iostream>
using namespace std;

main()
{
      int a = 3;
      const int * const b = &a;
      
      cout << "a: " << a << " - b: " << *b << endl;
      a = 5;
      cout << "a: " << a << " - b: " << *b << endl;      
      
      system("pause");
}
Code:
// Función valor por referencia.

#include <iostream>
using namespace std;

// Esta Función permite que la variable b
void Funcion(int *a)
{
       *a+= (*a * 2);  
}

main()
{
      int b = 5;
      
      cout << "valor: " << b << endl;
      Funcion(&b); // La variable b obtiene su nuevo valor, sin necesidad de hacer que la variable retorne el resultado de la función
      cout << "valor: " << b << endl;
      
      system("pause");
}
Code:
// Retornar un arreglo de Enteros

#include <iostream>
using namespace std;

int *Arreglo(int a)
{
       int i, Arr[10];
       
       for(i = 0; i < 10; i++)
       {
              Arr[i] = a + (i * 2);
       }
       
       return Arr;
}

main()
{      
      int a, *b;
      
      b = Arreglo(5); 
      a = *(b + 2); // b sería el primer elemento del arreglo, entonces b + 2 es el 3er elemento. SE DEBE RESPETAR EL PARENTESIS.
      
      cout << "valor: " << a << endl;
      
      system("pause");
}
Code:
// Recorrer un Arreglo de Enteros

#include <iostream>
using namespace std;
 
main()
{
    int arr[6] = { 1, 3, 5, 7, 9, 20 };
    int *a;
 
    a = arr; // Puntero toma valor del arreglo int
 
    // La x es el valor que se va a mostrar
    cout << *a << endl; //[x][3][5][7][9][20]
    a+= 2;
    cout << *a << endl; //[1][3][x][7][9][20]
    a-= 1;
    cout << *a << endl; //[1][x][5][7][9][20]
    a+= 4;
    cout << *a << endl; //[1][3][5][7][9][x]
    a-= 2;
    cout << *a << endl; //[1][3][5][x][9][20]
    
    system("pause");
}
Code:
// Punteros entre funciones

#include <iostream>
using namespace std;

//Una función es la dirección de memoria de donde comienza el código. Por ende se puede retornar entre funciones.
bool functionA(int param1, bool (*verificar)(int))
{
        if(((*verificar)(param1)))
        {
                return true;
        }
        return false;
}
 
bool functionB(int param)
{
        if(param & 1) // Es una forma de obtener los números impares mediante el uso de operadores Binarios
        {
                return false;
        }
        else
        {
                return true;
        }
}
 
main()
{
    int x = 110;
    bool a = functionA(x, functionB); // El segundo parametro es un puntero a la función B
    
    if(a)
    {
          cout << "Es Par" << endl;
    }
    else
    {
          cout << "Es Impar" << endl;
    }
                
    system("pause");
}
También te voy a agregar uno de una lista enlazada, no es complicado de entender.

Code:
#include <iostream>
using namespace std;

class Nodo {
	private:
	        int value;                  
	
	public:
	        Nodo *next;
	        Nodo(int value) // Constructor
            {
		         this->value = value;
		         next = NULL;
	        }
        	int GetValue() 
            {
        		return value;
        	}
};

main()
{
      int val, i;
      Nodo *head = NULL, *aux2;   
      
      for(i = 0; i < 4; i++)
      {       
              cout << "Ingresa Un valor: ";
              cin >> val;   
              
              if(head == NULL)
	          {
					 head = new Nodo(val);     
                     aux2 = head;                           
			  }
				
			  else
			  {
					 Nodo *body = head;
					
					 while(body->next != NULL)
					 {
						  body = body->next;
				     }
					
					 body->next = new Nodo(val); 	
			  }
      }
     
      cout << endl << "Listando..." << endl;	
			
	  Nodo *aux = aux2;		
      while(aux != NULL)
      {
			 cout << aux->GetValue() << endl;	     
			 aux = aux->next;
      } 
      system("pause");
}
Disculpa pero no sé como redactarlo de una mejor forma más teórica.

Quiero agregar por último que cuando veas Nodos, Lista enlazada, Stacks, Queue, Arbol binario y otros métodos avanzados, vas a utilizar MUCHO los punteros.
__________________
Proyects
Kreedz Chile Mod [100%] (Fixing some details).


Last edited by gladius; 05-27-2012 at 16:43.
gladius is offline
Send a message via MSN to gladius Send a message via Skype™ to gladius