int i;
int* ptr;
// i is an int
// ptr is a pointer to int
// therefore to get a pointer to i, you use &:
ptr = &i;
And apply it the same way:
1 2 3 4 5 6 7 8 9
typedefchar (*PtrCharArrayOf3)[3];
char a[3] = "ab";
PtrCharArrayOf3 ptr;
// 'a' is a char[3]
// 'ptr' is a ptr to a char[3]
ptr = &a;
The thing that makes this tricky is that array names can be implicitly cast to pointers:
1 2 3 4 5 6 7
char a[3] = "ab";
PtrCharArrayOf3 ptr3;
char* ptr;
ptr3 = &a; // points to the array
ptr = a; // points to the first char in the array
// effectively they point to the same thing, but via different types, and with different syntax
HOWEVER -- all that said -- the necessity of these types of pointers is rare to the point of being virtually nonexistant. If you find yourself needing to do this in a program, I'd recommend you question your approach, as there's probably a cleaner, simpler, and less funky solution to the problem at hand.