Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Gojira en 3 Marzo 2018, 12:40 pm



Título: Punteros y arrays.
Publicado por: Gojira en 3 Marzo 2018, 12:40 pm
He intentado asignar a un puntero la variable x que es de tipo entero directamente, y me pedia el operador de referencia.

int * ptr = x; //no me deja
int * ptr = &x; //si me deja

Luego he creado un array, y he intentado asignar a un puntero el array con el operador de referencia, y me pedia que le quitara el operador de referencia y apuntara directamente al array.

int x[5] = {1,2,3,4,5};

int * ptr = x; //si me deja
int * ptr = &x; //no me deja

¿Por que es eso?
¿Los arrays son un conjunto de punteros, x seria la direccion del valor de la primera celda del array x en realidad y int * ptr = &x es pedir la direccion de una direccion?


Título: Re: Punteros y arrays.
Publicado por: MAFUS en 3 Marzo 2018, 13:38 pm
Cómo ya te he dicho en otros mensajes sobre punteros, el nombre de un array es la dirección del primer elemento. Por eso lo puedes y debes asignar directamente.


Título: Re: Punteros y arrays.
Publicado por: vangodp en 3 Marzo 2018, 15:05 pm
x equivale a &x[0], por eso
No puedes hacer:
int * ptr = &x;

Pero puedes hacer:
int * ptr = &x[0];

x y &x[0] son lo mismo, como ya te lo han dicho.


Título: Re: Punteros y arrays.
Publicado por: Kenji-chan en 4 Marzo 2018, 03:24 am
enrealid es por que en c solo pudes asignar o igualar valores del mismo tipo,
int = variable de interos
& operador de direccion (solo cuando esta acompañado de una variable ejm &x)
*  operador de indireccion (solo cuando esta acompañado de una variable ejm *x)
entonces si los combinamos obtenemos:
int a = 20; // variable de tipo entero
int* x = &a; // una variable que almacena direcciones de memoria de tipo entero
int* b = x;  // una variable que almacena direcciones de memoria de tipo entero (y como x es un puntero no necesitamos agregar el operador de diseccionar)

bien ahora para usar los punteros se usa el operador de indireccion
*x += 10;

con esto modificamos el valor de la variable a la cual apunta x y be ya que es la misma dirección porque la igualamos a la dirección a la que apunta x.

bie haora que pasa con un
int x[5] = {1,2,3,4,5};

lo que estamos haciendo aqui es declarar 5 punteros de tipo int consecutivos osea uno después del otro,

y si hacemos un cout << *x << endl; imprimimos imprimimos el primer elemento de x (x[0] seria lo mismo) y para recorrerlo hacemos un *x++ y nos iriamos a la siguiente posición (lo cual no recomido si no dominas el tema de los punteros ya que con esto bas saltando en la memoria ram (int) bits (int = 4 bits))

por lo tanto si hacemos un
int x[5] = {1,2,3,4,5};
int* b = x; //obtenemos la primera posicion de x ya que x es un puntero

te dejo un codigo de ejemplo:

Código:
#include <iostream>
using namespace std;

int main(int argc, char *argv[]) {
int a = 20;
int* x = &a;
int* b = x;
int r[5] = {1,2,3,4,5};
int* c = r;

cout << "antes" << endl;
cout << "valor de a: " << a << " valor de x: " << *x << " valor de b: " << *b <<endl;
*x += 10;
cout << "despues" << endl;
cout << "valor de a: " << a << " valor de x: " << *x << " valor de b: " << *b <<endl;
cout << endl;
cout << "valor de c: " << *c << endl;
*c++;
*c++;
*c++;
cout << "valor de c + 3 pociciones: " << *c << endl;

return 0;
}