Está en la página 1de 14

PUNTEROS 2

Prof. GPR
Punteros como parámetros de funciones
• Los punteros son objetos como cualquier otro en C++, por lo tanto, tienen
las mismas propiedades y limitaciones que el resto de los objetos.
• Cuando pasamos un puntero como parámetro de una función por
valor pasa lo mismo que con cualquier otro objeto.
• Dentro de la función trabajamos con una copia del parámetro, que en este
caso es un puntero. Por lo tanto, las modificaciones en el valor del
parámetro serán locales a la función y no se mantendrán después de
retornar.
• Sin embargo, no sucede lo mismo con el objeto apuntado por el puntero,
puesto que en ambos casos será el mismo, ya que tanto el puntero como el
parámetro tienen como valor la misma dirección de memoria. Por lo tanto,
los cambios que hagamos en los objetos apuntados por el puntero se
conservarán al abandonar la función.
#include <iostream>
using namespace std; Ejemplo:
void funcion(int *q);

int main() {
int a;
int *p;

a = 100;
p = &a;
void funcion(int *q) {
// Llamamos a funcion con un puntero
// Cambiamos el valor de la variable
funcion(p); // (1)
apuntada por
cout << "Variable a: " << a << endl;
// el puntero
cout << "Variable *p: " << *p << endl;
*q += 50;
// Llamada a funcion con la dirección de "a"
q++;
(constante)
}
funcion(&a); // (2)
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
system("pause>null");
return 0;
}
• Dentro de la función se modifica el valor apuntado por el puntero, y
los cambios permanecen al abandonar la función. Sin embargo, los
cambios en el propio puntero son locales, y no se conservan al
regresar.
• Análogamente a como lo hicimos antes al pasar una constante literal,
podemos pasar punteros variables o constantes como parámetro a la
función. En (1)usamos un variable de tipo puntero, en (2) usamos un
puntero constante.
• De modo que con este tipo de declaración de parámetro para función
estamos pasando el puntero por valor. ¿Y cómo haríamos para pasar
un puntero por referencia?:
#include <iostream> void funcion(int *q) {
using namespace std; // Cambiamos el valor de la variable
void funcion(int *q); apuntada por el puntero
int main() { cout<<"Direccion q==="<<q<<endl;
int a; *q += 50;
int *p; q++;
a = 100; cout<<"Direccion q=="<<q<<endl;
p = &a; }
// Llamamos a funcion con un puntero
cout<<"Direccion de a==="<<p<<endl;
funcion(p); // (1)
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
cout<<"Direccion de a===="<<&a<<endl;
// Llamada a funcion con la dirección de "a"
(constante)
funcion(&a); // (2)
cout << "Variable a: " << a << endl;
cout << "Variable *p: " << *p << endl;
system("pause>null");
return 0;
}
#include<iostream>
using namespace std;
int main()
{
int num[]={10,20,30,40,50};
int *dir_num;
dir_num=&num[0]; /*señala al primer elem del
arreglo (su dirección)
dir_num=num; /* solo para arreglos */
for(int i=0;i<5;i++){
cout<<"num["<<i<<"]="<<*dir_num++<<endl;}
cout<<"sus direcciones son:"<<endl;
for(int i=0;i<5;i++){
cout<<" dir de num["<<i<<"]="<<&num[i]<<endl;}
dir_num=num; //dirección de 1er elemento
cout<<"sus direcciones son:"<<endl;
for(int i=0;i<5;i++) {
cout<<" dir de
num["<<i<<"]="<<dir_num++<<endl;}
system("pause>null");
}
#include<iostream>
using namespace std;
int main()
{
int num[]={10,20,30,40,50};
int *dir_num;
dir_num=&num[0]; /*señala al primer elem del
arreglo (su dirección)
dir_num=num; /* solo para arreglos */
for(int i=0;i<5;i++){
cout<<"num["<<i<<"]="<<*dir_num++<<endl;}
dir_num=num; //dirección de 1er elemento
cout<<"sus valores son:"<<endl;
for(int i=0;i<5;i++) {
cout<<" valor de
num["<<i<<"]="<<*(dir_num+i)<<endl;}

system("pause>null");
}
#include<iostream>
using namespace std;
int main()
{
int i,j,a[][3]={{10,20,30},{40,50,60}};
int *da;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<"\ta["<<i<<"]["<<j<<"]="<<a[i][j]<<endl;
for(i=0;i<2;i++)
for(j=0;j<3;j++)
cout<<"dm=&a["<<i<<"]["<<j<<"]="<<&a[i][j]<<end
l;
da=&a[0][0];
for(i=0;i<2;i++){
cout<<endl;
for(j=0;j<3;j++)
cout<<"\t"<<*(*(a+i)+j);
}
system("pause>null");
}
#include<iostream>
using namespace std;
int main()
{
int i,x[]={10,20,30,40};
int *pt;
for(i=0;i<4;i++)
cout<<x[i]<<endl;
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<&x[i]<<endl;
pt=&x[0];
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<pt++<<endl;
system("pause>null");
}
#include<iostream>
using namespace std;
int main()
{
int i,x[]={10,20,30,40};
int *pt;
for(i=0;i<4;i++)
cout<<x[i]<<endl;
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<&x[i]<<endl;
pt=&x[0];
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<pt+i<<endl;
system("pause>null");
}
#include<iostream>
using namespace std;
int main()
{
int i,x[]={10,20,30,40};
int *pt;
for(i=0;i<4;i++)
cout<<x[i]<<endl;
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<&x[i]<<endl;
pt=&x[0];
cout<<"Reportar las direcciones"<<endl;
for(i=0;i<4;i++)
cout<<pt+i<<endl;
cout<<"Reportar valores:\n";
for(i=0;i<4;i++)
cout<<*(pt+i)<<endl;
system("pause>null");
}
#include<iostream> pt=&x[0][0];
using namespace std; cout<<"\nReportando direcciones de la
int main() matriz"<<endl;
{ for(i=0;i<2;i++){
int i,j,x[][3]={{10,20,30},{40,50,60}}; cout<<endl;
int *pt; for(j=0;j<3;j++)
cout<<"Reportando la matriz"<<endl; cout<<"\t"<<pt++;
for(i=0;i<2;i++){ }
cout<<endl; cout<<"\nReportando ....."<<endl;
for(j=0;j<3;j++)
cout<<"\t"<<x[i][j]; for(i=0;i<2;i++){
} cout<<endl;
cout<<"\nReportando direcciones de la for(j=0;j<3;j++)
matriz"<<endl; cout<<"\t"<<*(*(x+i)+j);
for(i=0;i<2;i++){ }
cout<<endl; system("pause>null");
for(j=0;j<3;j++) }
cout<<"\t"<<&x[i][j];
}
Uso de puntero en arreglos
• Debido a que los índices de los arreglos empiezan en cero para
acceder a un determinado elemento de un vector w, ejemplo cuarto
elemento, se puede escribir:
• w[3] ó *(w+3)
• En una matriz g cuyos contadores se inicializan a partir de cero, el
acceso puede especificarse como:
• g[i][j] ó *(*(g+i)+j)
• OTRA FORMA: Matriz g[i][j] = *(punt + n°_de_columnas*i + j)
donde punt=&g[0][0]

También podría gustarte