This element is an integer, so a is a pointer to a single integer. Therefore, declaring p as a pointer to an integer and setting it equal to a works. Now that p is pointing at the 0th element of a , you can do some rather strange things with it. The a variable is a permanent pointer and can not be changed, but p is not subject to such restrictions. C actually encourages you to move it around using pointer arithmetic .
C takes care of the details of element size.
You can copy the array a into b using pointers as well. C does not care - it blithely goes along incrementing p and q , copying away over other variables with abandon. You need to be careful when indexing into arrays in C, because C assumes that you know what you are doing. You can pass an array such as a or b to a function in two different ways. Imagine a function dump that accepts an array of integers as a parameter and prints the contents of the array to stdout.