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