Friday, June 18, 2010

Arrays as Pointers

Using an array name as a pointer
An array name is really a pointer to the first element of the array.
For example, the following is legal.
int b[100]; // b is an array of 100 ints.
int* p; // p is a pointer to an int.
p = b; // Assigns the address of first element of b to p.
p = &b[0]; // Exactly the same assignment as above.

Array name is a const pointer
When you declare an array, the name is a pointer, which cannot be altered. In the previous example, you could never make this assignment.
p = b; // Legal -- p is not a constant.
b = p; // ILLEGAL because b is a constant, altho the correct type.

Pointer arithmetic
"Meaningful" arithmetic operations are allowed on pointers.
Add or subtract integers to/from a pointer. The result is a pointer.
Subtract two pointers to the same type. The result is an int.
Multiplying, adding two pointers, etc. don't make sense.

Pointer addition and element size
When you add an integer to a pointer, the integer is multiplied by the element size of the type that the pointer points to.
// Assume sizeof(int) is 4.
int b[100]; // b is an array of 100 ints.
int* p; // p is a a pointer to an int.
p = b; // Assigns address of first element of b. Ie, &b[0]
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1]

Equivalence of subscription and dereference
Because of the way C/C++ uses pointers and arrays, you can reference an array element either by subscription or * (the unary dereference operator).
int b[100]; // b is an array of 100 ints.
int* p; // p is a a pointer to an int.
p = b; // Assigns address of first element of b. Ie, &b[0]
*p = 14; // Same as b[0] = 14
p = p + 1; // Adds 4 to p (4 == 1 * sizeof(int)). Ie, &b[1]
*p = 22; // Same as b[1] = 22;

Example - Two ways to add numbers in an array
The first uses subscripts, the second pointers. They are equivalent.
int a[100];
. . .
int sum = 0;
for (int i=0; i<100; i++) {
sum += a[i];
}

int a[100];
. . .
int sum = 0;
for (int* p=a; p
sum += *p;
}

No comments:

Post a Comment