Pointers and arrays
- C: Lvalues and Rvalues
- Java: Objects and primitive data types
&
— address-of operator*
— indirection (or dereference) operator- If
P
is an array of integers, thenP
is a constant pointer to an integer. - Pointer arithmetic — The follow rules formally apply only
when the pointers address lvalues within the same array
P[i]
is*(P+i)
.- If
P
is a pointer to an integer, thenP+i
is a pointer to thei
’th integer after the integer referenced byP
. - If
P
is a pointer to an integer, thenP-i
is a pointer to thei
’th integer before the integer referenced byP
. P++
incrementsp
to point to the next integer in memory.P--
decrementsp
to point to the previous integer in memory.
NULL
in C is similar tonull
in Java.- Pascal had pointers:
@P
for&P
andP^
forP*
.
It only gets worse
Suppose both P
and Q
are pointers
to integers.
P+i
andP-i
andP<Q
andP>Q
andP++
andP--
andP-Q
are formally defined only if the relevant pointers are elements of the same array- or the non-allocated location one past the end of the array
P + Q
is not allowed for pointersvoid *
is the type of a generic pointer* (long *) (void *) &P[5]
is weird but implies intent(long) (void *) &P[5]
is(long) (void *) P + 5 * sizeof(*P)
(long) (void *) &P[5] - (int) (void *) &P[3]
is2 * sizeof(*P)
Take a look at the following.
- qsort man page
- illustrative program that may be run at GeeksforGeeks
Trying it out
Take a look at Problem 16 from the Fall 2014 Final exam.