char *c; // c is uni dimensional table ( single row )
No, c is a pointer, not an array. If you initialize it properly, it can point to the first element of an array, but the pointer itself is not an array.
char **p ; // p is a two dimensional table
No, p is a pointer to a char*; it's not a table. Again, it might point to something that acts like a two-dimensional array. A true two-dimensional array is simply an array of arrays, but there are several other ways to use pointers to simulate more flexible versions of 2-d arrays, with dynamic allocation and varying row sizes.
**p = *c; // what does this mean ?
If p and c haven't been initialized, it means undefined behavior (which means your program crashes if you're lucky. If they have been initialized properly: p points to a char* object; let's call that object pstar. pstar points to a char object; let's call that object pstarstar. c also points to a char object; let's call it cstar. The assignment copies the value of cstar into pstarstar.
What that means depends on what p and c point to.
Recommended reading: section 6 of the comp.lang.c FAQ.