You are on page 1of 11

Department of Computer and Information Science,

School of Science, IUPUI

CSCI 230

Pointers
Pointer Arithmetic
Dale Roberts, Lecturer
Computer Science, IUPUI
E-mail: droberts@cs.iupui.edu

Dale Roberts
Pointer Expressions and Pointer Arithmetic

pv+n
pv + n*sizeof(variable type that pointer point to)
Arithmetic operations can be performed on pointers
Increment/decrement pointer (++ or --)
Example:
++vPtr, vPtr++,
--vPtr, vPtr--
Add an integer to a pointer( + or += , - or -=)
Pointers may be subtracted from each other
Operations meaningless unless performed on an array

Dale Roberts
Example:
Five element int array on machine with 4 byte
ints
vPtr points to first element v[ 0 ]whose address
location is 3000 (vPtr = 3000)
vPtr += 2;
// sets vPtr to 3008
vPtr points to v[ 2 ] (incremented by 2), but
the machine has 4 byte integers, so it points to
location
address 3008 3000 3004 3008 3012 3016
pointer variable v[0] v[1] v[2] v[3] v[4]
vPtr
Dale Roberts
Pointer Expressions and Pointer Arithmetic
Example: (double pointer)
Assume long (long integer) is 4 bytes, and pointer variable is 2 bytes.
long a[10]={5, 10, 15, }; Questions:
long *pa, **ppa;
int i=5; Expression Value Note
pa = &a; a pa+1 644 640+1*4
ppa = &pa;
640 5 pa+3 652 640+3*4
644 10
pa+i 660 640+i*4
800 700 648 15
700 640 652 ppa+1 702 700+1*2
ppa pa 656 ppa+i 710 700+i*2
660
*pa+1 6 5+1
Variable Address Value
*(pa+1) 10 a[1]=pa[1]=*(a+1)
a 640 5
pa[2] 15 648
644 10
*ppa 640 value of pa
648 15
*ppa+1 644 pa+1

*(ppa+1) invalid *(702)
pa 700 640
**ppa+1 6 a[0]+1 = 5+1
ppa 800 700
*(*ppa+1) 10 *(pa+1)=*(640+1*4)
Dale Roberts
Pointer Expressions and Pointer Arithmetic
Subtracting pointers
Returns number of elements from one to the other. If
vPtr2 is a pointer pointing to v[ 2 ];
vPtr is a pointer pointing to v[ 0 ];
vPtr2 - vPtr would produce 2
Pointer comparison ( <, == , > )
See which pointer points to the higher numbered array element
Also, see if a pointer points to 0
Pointers of the same type can be assigned to each other
If not the same type, a cast operator must be used
Exception: pointer to void (type void *)
Generic pointer, represents any type
No casting needed to convert a pointer to void pointer
void pointers cannot be dereferenced

Dale Roberts
The Relationship Between Pointers and Arrays
Arrays and pointers are closely related
Array name like a constant pointer
Pointers can do array subscripting operations
Example: Declare an array b[ 5 ] and a pointer bPtr
bPtr = b;
// To set them equal to one another
// The array name (b) is actually the address of first element of the array
bPtr = &b[ 0 ];
// Explicitly assigns bPtr to address of first element of b
To access element b[ 3 ]:
x=*( bPtr + 3 ) // Where n is the offset. Called pointer/offset notation
x=bptr[ 3 ] // Called pointer/subscript notation
// bPtr[ 3 ] same as b[ 3 ]
x=*( b + 3 ) // Performing pointer arithmetic on the array itself

Dale Roberts
Pointers and Arrays
Strong relation between pointers and arrays
Pointers and arrays can be used interchangeably.
The array name is equivalent to the address of the first
element in the array
Example:
int a[10];
int *pa;
pa = &a[0]; /* is equivalent to pa = a */
So, a[1] *(pa+1) pa[1] *(a+1)
&a[1] pa+1 a+1
a[i] *(pa+i) pa[i] *(a+i)
&a[i] pa+i a+i
a[i]+=5 *(pa+i)+=5 pa[i]+=5
Example:
f(int s[]) f(int *s)
{ {
} }

Dale Roberts
Arrays of Pointers
Arrays can contain pointers
For example: an array of strings

char *suit[4] = {"Hearts", "Diamonds",


"Clubs", "Spades"};
Strings are pointers to the first character
char * each element of suit is a pointer to a char
The strings are not actually stored in the array suit, only pointers to
the strings are stored
suit[0] H e a r t s \0

suit[1] D i a m o n d s \0

suit[2] C l u b s \0

suit[3] S p a d e s \0

suit array has a fixed size, but strings can be of any size
Dale Roberts
Pointers to Functions
Pointer to function
Contains address of function
Similar to how array name is address of first
element
Function name is starting address of code
that defines function
Function pointers can be
Passed to functions
Stored in arrays
Assigned to other function pointers
Dale Roberts
Example: Bubble Sort
#define SIZE 10 void swap( int *element1Ptr,
void bubble(int [],const int, int *element2Ptr ) {
int (*)(int,int)); int temp;
int ascending( int, int ); temp = *element1Ptr;
int descending( int, int );
*element1Ptr = *element2Ptr;
*element2Ptr = temp;
int main() {
}
int a[SIZE] = { 2, 6, 4, 8, 10,
12, 89, 68, 45, 37 };
int ascending( int a, int b ) {
bubble( a, SIZE, ascending );
return b < a;
bubble( a, SIZE, descending );
/*swap if b is less than a*/
}
}

int descending( int a, int b ) {


return b > a;
/*swap if b is greater than a*/
}
void bubble( int work[], const int size,
int (*compare)(int,int)) {
int pass, count;
void swap( int *, int * );
for (pass=1; pass<size; pass++)
for (count=0; count<size-1; count++)
if ((*compare)(work[count],work[count+1]))
swap(&work[count],&work[count + 1]);
}

Dale Roberts
Function bubble takes a function pointer
bubble calls this helper function
this determines ascending or descending sorting
The argument in bubblesort for the function
pointer:
bool ( *compare )( int, int )
tells bubblesort to expect a pointer to a function that
takes two ints and returns a bool
If the parentheses were left out:
bool *compare( int, int )
Declares a function that receives two integers and
returns a pointer to a bool

Dale Roberts

You might also like