Lecture 5: Pointers and Arrays
Arrays are one of the most fundamental concepts in programming. In C, pointers are tightly tied to the implementation of arrays. This lecture will briefly cover both topics.
Pointers 1
Before we get into pointers, we have to learn a bit about computer memory. RAM is a long long array of bytes.
Given some code:
int main(void) {
int n;
int *p;
...
}
There is a place in my memory that looks like this:
:
Address: :
|-----|
0x5100| | n is an integer, one machine word big
|-----|
0x5104| | p is a pointer, also one word big
|-----|
0x5108| | other unused memory
|-----|
:
:
Giving these variables some values, lets set n to be the number 151.
n = 151;
I set the pointer p to point to the integer n.
p = &n;
That says, "the value of the variable p is assigned the address of the variable n".
:
Address: : Value at that address:
|----|
0x5100| 151| n
|----|
0x5104|5100| p
|----|
0x5108| ?|
|----|
:
:
Now I want to print out the value of n, by two ways.
printf("n is %d.\n", n);
printf("n is %d.\n", *p);
The * operator says, "give me the object at the following address." The object's type is the type that the pointer was declared as. So, since we declared "int *p", the object pointed at will be assumed by C to be an int. In this case, we were careful to make this coincide with what we were pointing at.
Now I want to print out the memory address of n.
printf("n is located at $%x.\n", &n);
printf("n is located at $%x.\n", p);
The & operator says, "tell me the address where the following object starts." In this case, it is hex 5100 (I put a '$' before it, to conform to the Assembly notation I am used to). Notice the value of p is an address.
Hm. Does p have an address? Sure. It is a variable, and all variables have their own address. The address of p is hex 5104.
printf("p is located at $%x.\n", &p);
Here we are taking the address of a pointer variable, using the & operator.
As we discuss strings and go deeper with arrays, more pointer related discussions will continue.
Arrays 2
Arrays a kind of data structure that can store a fixed-size sequential collection of elements of the same type. An array is used to store a collection of data, but it is often more useful to think of an array as a collection of variables of the same type.
Instead of declaring individual variables, such as number0, number1, ..., and number99, you declare one array variable such as numbers and use numbers[0], numbers[1], and ..., numbers[99] to represent individual variables. A specific element in an array is accessed by an index.
All arrays consist of contiguous memory locations. The lowest address corresponds to the first element and the highest address to the last element.
:
Address: : Value at that address:
|----|
0x5100| ?| first values in array
|----|
0x5104| ?| second value of array
|----|
0x5108| ?| third value of array
|----|
:
:
Declaring arrays
To declare arrays in c. We use the following syntax.
type arrayName [ arraySize ];
This is called a single-dimensional array. The arraySize must be an integer constant greater than zero and type can be any valid C data type. For example, to declare a 10-element array called balance of type int, use this statement −
int balance[10];
Here balance is a variable array which is sufficient to hold up to 10 double numbers.
Initializing Arrays
You can initialize an array in C either one by one or using a single statement as follows −
int balance[5] = {1000, 2, 3, 7, 50};
The number of values between braces { } cannot be larger than the number of elements that we declare for the array between square brackets [ ].
If you omit the size of the array, an array just big enough to hold the initialization is created. Therefore, if you write −
int balance[] = {1000, 2, 3, 7, 50};
You will create exactly the same array as you did in the previous example. Following is an example to assign a single element of the array −
balance[4] = 50;
The above statement assigns the 5th element in the array with a value of 50.0. All arrays have 0 as the index of their first element which is also called the base index and the last index of an array will be total size of the array minus 1. Shown below is the pictorial representation of the array we discussed above −
:
Address: : Value at that address:
|----|
0x5100|1000| first values in array
|----|
0x5104| 2| second value of array
|----|
0x5108| 3| third value of array
|----|
0x5112| 7| fourth value of array
|----|
0x5116| 50| fifth value of array
|----|
:
:
Accessing array elements
An element is accessed by indexing the array name. This is done by placing the index of the element within square brackets after the name of the array. For example −
double salary = balance[9]; The above statement will take the 10th element from the array and assign the value to salary variable. The following example Shows how to use all the three above mentioned concepts viz. declaration, assignment, and accessing arrays −
#include <stdio.h>
int main () {
int n[ 10 ]; /* n is an array of 10 integers */
int i,j;
/* initialize elements of array n to 0 */
for ( i = 0; i < 10; i++ ) {
n[ i ] = i + 100; /* set element at location i to i + 100 */
}
/* output each array element's value */
for (j = 0; j < 10; j++ ) {
printf("Element[%d] = %d\n", j, n[j] );
}
return 0;
}
When the above code is compiled and executed, it produces the following result −
Element[0] = 100
Element[1] = 101
Element[2] = 102
Element[3] = 103
Element[4] = 104
Element[5] = 105
Element[6] = 106
Element[7] = 107
Element[8] = 108
Element[9] = 109
1: Pointer discussion partially from Bill Karwin. This is the best reference on pointers I've found.
2: Array discussion partially from tutorials point.