Hola,
Mira aquí tienes un ejemplo de usos de punteros:
#include <stdio.h>
int main()
{
int a = 5, b = 10, c = 20, d = 40;
int *p1; // Puntero a entero
int *p2[2]; // Array de punteros a enteros
int *p3[2][2]; // Array de array de punteros a enteros
p1 = &a;
printf("*p1 = %d\n", *p1
); // imprime 5
p2[0] = &a; p2[1] = &b;
printf("*p2[0] = %d, *p2[1] = %d\n", *p2
[0], *p2
[1]); // imprime 5, 10 printf("**p2 = %d, *(*p2+1) = %d\n", **p2
, *(*p2
+1)); // imprime 5, 10
p3[0][0] = &c; p3[1][1] = &d;
printf("*p3[0][0] = %d, *p3[0][1] = %d\n", *p3
[0][0], *p3
[1][1]); // imprime 20, 40 printf("***p3 = %d, **(*(p3+1)+1) = %d\n", ***p3
, **(*(p3
+1)+1)); // imprime 20, 40
return 0;
}
En el caso de que fuera usando memoria dinámica, es lo mismo solo que tendrías que reservar la memoria antes, claro.
Saludos!