lecture 7: arrays
DESCRIPTION
Lecture 7: Arrays. BJ Furman 06OCT2012. The Plan for Today. Announcements Review of variables and memory Arrays What is an array? How do you declare and initialize an array? How can you use an array? Array Examples Array Practice. Announcements. Midterm this week in lab - PowerPoint PPT PresentationTRANSCRIPT
Lecture 7: Arrays
BJ Furman
06OCT2012
The Plan for Today
Announcements Review of variables and memory Arrays
What is an array? How do you declare and initialize an array? How can you use an array?
Array Examples Array Practice
Announcements
Midterm this week in lab Bring: text, notes, HW, lab reports, calculator Covers everything through pointers
Lab project 7 after midterm
Learning Objectives
Explain what a pointer is (review)
Explain what an array is
Declare and initialize an array
Use an array in a program
What is a Pointer? - 1 Variables in general
Variable declaration informs compiler of two things:
1. Name of the variable2. Data type of the variable Actions caused:
Bytes allocated in memory Symbol table with name,
address, and value Can think of a variable as
having two "values" Value of what is stored at the
memory location (rvalue) Value of the memory location
(its address) (lvalue)
int var1 = 0;
10FE
Var address
0intvar1
Var valueVar typeVar name
Symbol Table
Memory (8-bit)Address
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0x10FE
0x10FF
Bit 7 6 5 4 3 2 1 0
0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0
0x1100
0x1101
Bit 7 6 5 4 3 2 1 0
Memory (8-bit)Address
0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 1
0x10FE
0x10FF
What is a Pointer? - 2 Variables in general,
cont. Assigning a value to a
variable (i = 3;) Value is copied to the
memory location at the address listed in the symbol table
Using a variable in an expression (j = i;)
Value of what is stored at the memory location is accessed
short int i, j;
i = 3; j = i;
1100short intj
10FE
Address
short inti
ValueTypeName
Symbol Table
What is a Pointer? - 3 Pointer variable
A variable thatcontains anaddress
Declaring apointervariable
type * varname int* ptr1; float *ptr2; char * ptr3;
Read as: "ptr1 is a pointer to an integer" "ptr2 is a pointer to a float" "ptr3 is a pointer to a char"
#include <stdio.h>
int main(){ int num1; int *ptr1 = &num1, *ptr2; num1 = 7; printf("size of num1: %d\n",sizeof(num1)); printf("value of num1: %d\n",num1); printf("address of num1: %p\n",&num1); printf("address in ptr1: %p\n",ptr1); return 0;}
&num1 means:the address forthe variable num1
•What is the size of num1?•Is &num1 == ptr1?•What address is stored in ptr2?
Always initialize pointers you declare!An uninitialized pointer is like a loaded gun pointed in a direction that you don’t know.
Accessing What a Pointer Points To
The indirection operator * gets the value at the address stored in the pointer
#include <stdio.h>
int main(){ int num1; int *ptr1 = &num1; num1 = 7; printf("value of num1: %d\n", num1); printf("value of num1: %d\n", *ptr1); return 0;}
Pointer - Practice 1
Declare: x_ptr, a pointer to an integer y_ptr, a pointer to a double
What do the following statements do? char *my_ptr, my_char1 = 'c', my_char2; my_ptr = &my_char1; my_char2 = *my_ptr;
What is in: my_ptr (in declaration? in second line?) my_char1 my_char2 (in declaration? in last line?)
ASCII Table
Why Use Pointers?
Allows a function to modify variables in the calling function (without using global variables)
Return more than one value from a function call
Pass a pointer to a large data structure rather than copying the whole structure Arrays (coming next)
What is an Array? So far we've dealt with
scalar variables contain just one value
Arrays are collections of data of the same type that occupy contiguous memory locations
Individual values in the collection are called elements of the array
Need to declare before use:
#include <stdio.h>
int main(){ int i; char test[4]; test[0]='M'; test[1]='E'; test[2]='3'; test[3]='0'; for(i=0; i<4; i++) { printf("test[%d]=%c",i,test[i]); printf(" @ 0x%p\n",&test[i]); } return 0;}
Format (1D array) type array_name [num_elements];
Ex. Array of 4 characters named, 'test'
What is an array? - 2
Index No. [0] [1] [2] [3 [4] [5] [6] [7] [8] [9]int nums [10];
Element No. 1 2 3 4 5 6 7 8 9 10
int nums [10]; 10 element array of integers
Element no. 3 is accessed by:nums [2]
because indexing begins at 0
Accessing Array Elements Individual elements of an
array are accessed by their index number
** Important Note** Array indexing starts at
zero (take note of this, it is easy to forget!)
char test[4]; the first element is
test [0] the fourth element is
test [3]
#include <stdio.h>
int main(){ int i; char test[4]; test[0]='M'; test[1]='E'; test[2]='3'; test[3]='0'; for(i=0; i<4; i++) { printf("test[%d]=%c",i,test[i]); printf(" @ 0x%p\n",&test[i]); } return 0;}
Be careful! The C compiler may not stop you from indexing beyond the
boundary of your array. (What could happen?) What is test[4]?
array_practice2.c
Initializing Array Elements Use braces to enclose
the elements Separate elements by
commas Can set number of
elements in declaration: Explicit: int nums[5] Implicit: int imp[ ] = {1, 2};
Read from the keyboard Ex. array_practice3.c
Note addresses
Ex. array_practice4.c Read from the keyboard
/* array_practice3.c */
#include <stdio.h>
int main(){ int i; int nums[5]={0,1,2,3,4}; for(i=0; i<5; i++) { printf("nums[%d]=%d",i,nums[i]); printf(" @ 0x%p\n",&nums[i]); } return 0;}
Arrays of Multiple Dimensions - 1 Arrays can
have more than one dimension 2D matrices
commonly used in linear algebra
/* array_practice5.c */#include <stdio.h>
int main(){ int i,j; int my_array1[2][3]={{0,1,2},{3,4,5}}; for(i=0; i<2; i++) { printf("\n"); for(j=0; j<3; j++) printf("%d ", array1[i][j]); } return 0;}
Declaration for2D array: int my_array1[number_of_rows][number_of_columns]; Enclose each row of initializers in its own set of braces Note method to print and access individual elements Can think of array1 as a "2-element array of 3 elements"
Arrays of Multiple Dimensions - 2 Arrays of more than one dimension, cont.
Declaration for 3D array: int Ary3[nx][ny][nz]; Enclose each row of initializers in its own set of braces Order of storage: far right subscript increments first (called,
‘row-major’ order) Ary3[0][0][0] Ary3[0][0][1] Ary3[0][0][2] etc. to Ary3[nx-1][ny-1][nz-1] To find the element number for Ary3[x][y][z] declared to be of
size [I] [J] [K]:
ex. If I=J=K=10, Ary3[2][0][7]--> 2(10*10)+0+7+1=208th Ex. array_practice6.c
Initializes a 4x3x2 element array Can think of array2 as a "4-element array of 3x2 element arrays"
1)()( zKyJKx
Arrays - Practice 1
Declare: an array of 100 characters named char100 a 3x4 array of doubles named data1
Givenint my_array1[2][3]={{0,1,2},{3,4,5}};
Find my_array1[1][2] my_array1[0][0] my_array1[0][3]
Array Names An array name by itself
is interpreted as a constant pointer to the first element of the array.
&test[0] isequivalent to test
A constant pointer to the first element of test
test[0] is equivalent to *test
first element of test
#include <stdio.h>
int main(){ int i=0; char test[]={'M','E','3','0'} printf("test[%d]==%c",i,test[i]); printf(" @ 0x%p\t",&test[i]); printf("test[%d]==%c", i, *test); printf(" @0x%p\n", test); for(i=1; i<4; i++) { printf("test[%d]==%c",i,test[i]); printf(" @ 0x%p\n",&test[i]); } return 0;}
array_practice9.c
Pointer Arithmetic
Pointer arithmetic array[n] is equivalent to *(array + n)
Using just the name 'array' is equivalent to a constant pointer to the first element of array (i.e., base address)
Dereferencing the expression, where an integer n is added to 'array', is equivalent to indexing the array to its element at subscript n
array names cannot be changed, but pointer variables can be changed may not have: array_name = &var; the array name is a constant pointer and may not be
changed
Passing an Array to a Function Prototype and
function header need:
data type array name [ ]
Function call with actual name of array
Note: in the function prototype and function header
char *array would also work
#include <stdio.h>void PrintArray(int elements, char array[]);int main(){
/* initialize the array */ char test[]={'M','E','3','0'};
/* get the size of the array */int num_elem=sizeof(test)/sizeof(char);
/* pass array to function */
PrintArray(num_elem, test); return 0;}/* PrintArray() function definition */void PrintArray(int num_elem, char array[]){ int i; for(i=0; i<num_elem; i++)
{ printf("test[%d]==%c",i,array[i]); printf(" @ 0x%p\n",&array[i]); }}
Review
References Jensen, T. (2003). A Tutorial on Pointers and Arrays
in C, available from: http://home.netcom.com/~tjensen/ptr/pointers.htm. .Visited 02OCT2009
Parlante, N. (1999) Pointer Basics, [online]. Available from: http://cslibrary.stanford.edu/106/
Passing Arrays to Functions, [online]. Available from: http://irc.essex.ac.uk/www.iota-six.co.uk/c/f3_passing_arrays_to_functions.asp. Visited 12MAR2010.
http://www.asciitable.com/. Visited 03OCT2009.