Punteros y arrays.

Iniciado por Gojira, 3 Marzo 2018, 12:40 PM

0 Miembros y 1 Visitante están viendo este tema.

Gojira

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?

MAFUS

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.

vangodp

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.

Kenji-chan

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:


#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;
}