Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
0% found this document useful (0 votes)
47 views

Arrays in C & C++: (Including A Brief Introduction To Pointers)

This document provides an introduction to arrays in C and C++, including pointers. It defines arrays as collections of objects of the same type stored contiguously in memory. It discusses declaring and initializing arrays, static versus automatic storage, and determining array sizes. It also covers two-dimensional arrays, array indexing and bounds checking, and using pointers to reference array elements.

Uploaded by

jeme2nd
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
47 views

Arrays in C & C++: (Including A Brief Introduction To Pointers)

This document provides an introduction to arrays in C and C++, including pointers. It defines arrays as collections of objects of the same type stored contiguously in memory. It discusses declaring and initializing arrays, static versus automatic storage, and determining array sizes. It also covers two-dimensional arrays, array indexing and bounds checking, and using pointers to reference array elements.

Uploaded by

jeme2nd
Copyright
© Attribution Non-Commercial (BY-NC)
Available Formats
Download as PPT, PDF, TXT or read online on Scribd
You are on page 1/ 46

Arrays in C & C++

(including a brief introduction to pointers)


CS-2303 System Programming Concepts
(Slides include materials from The C Programming Language, 2nd edition, by Kernighan and Ritchie and from C: How to Program, 5th and 6th editions, by Deitel and Deitel)

CS-2303, C-Term 2010

Arrays in C & C++

Reading Assignment
Chapter 6 of Deitel & Deitel Chapter 5 of Kernighan & Ritchie

CS-2303, C-Term 2010

Arrays in C & C++

Definition Array
A collection of objects of the same type stored contiguously in memory under one name
May be type of any kind of variable May even be collection of arrays!

For ease of access to any member of array For passing to functions as a group
CS-2303, C-Term 2010 Arrays in C & C++ 3

Arrays in C
By far, the dominant kind of data structure in C programs Many, many uses of all kinds
Collections of all kinds of data Instant access to any element

CS-2303, C-Term 2010

Arrays in C & C++

Examples
int A[10]
An array of ten integers A[0], A[1], , A[9]

double B[20]
An array of twenty long floating point numbers B[0], B[1], , B[19]

Arrays of structs, unions, pointers, etc., are also allowed Array indexes always start at zero in C
CS-2303, C-Term 2010 Arrays in C & C++ 5

Examples (continued)
int C[]
An array of an unknown number of integers (allowable in a parameter of a function) C[0], C[1], , C[max-1]

int D[10][20]
An array of ten rows, each of which is an array of twenty integers D[0][0], D[0][1], , D[1][0], D[1][1], , D[9][19] Not used so often as arrays of pointers
CS-2303, C-Term 2010 Arrays in C & C++ 6

Two-dimensional Arrays
int D[10][20] A one-dimensional array with 10 elements, each of which is an array with 20 elements I.e., int D[10][20] /*[row][col]*/

Last subscript varies the fastest


I.e., elements of last subscript are stored contiguously in memory

Also, three or more dimensions


CS-2303, C-Term 2010 Arrays in C & C++ 7

Array Element
May be used wherever a variable of the same type may be used
In an expression (including arguments) On left side of assignment

Examples:
A[3] = x + y; x = y A[3]; z = sin(A[i]) + cos(B[j]);
CS-2303, C-Term 2010 Arrays in C & C++ 8

Array Elements (continued)


Generic form:
ArrayName[integer-expression] ArrayName[integer-expression] [integer-expression]

Same type as the underlying type of the array

Definition: Array Index the expression between the square brackets


Also called an Array Subscript

CS-2303, C-Term 2010

Arrays in C & C++

Array Elements (continued)


Array elements are commonly used in loops E.g.,
for(i=0; i < max; i++) A[i] = i*i; for(sum = 0, j=0; j < max; j++) sum += B[j];

for (count=0;rc!=EOF;count++) rc=scanf("%f", &A[count]);


CS-2303, C-Term 2010 Arrays in C & C++ 10

Caution! Caution! Caution!


It is the programmers responsibility to avoid indexing off the end of an array
Likely to corrupt data May cause a segmentation fault Could expose system to a security hole!

C does NOT check array bounds


I.e., whether index points to an element within the array Might be high (beyond the end) or negative (before the array starts)
CS-2303, C-Term 2010 Arrays in C & C++ 11

Caution! Caution! Caution!


It is the programmers responsibility to avoid indexing off the end of an array
Likely to corrupt data May cause a segmentation fault Could expose system to a security hole!

C does NOT check array bounds


I.e., whether index points to an element within the array Might be high (beyond the end) or negative (before the array starts)
CS-2303, C-Term 2010 Arrays in C & C++ 12

Questions

CS-2303, C-Term 2010

Arrays in C & C++

13

Declaring Arrays
Static or automatic Array size may be determined explicitly or implicitly

Array size may be determined at run-time


Automatic only Not in textbook

CS-2303, C-Term 2010

Arrays in C & C++

14

Declaring Arrays (continued)


Outside of any function always static
int A[13];
#define CLASS_SIZE 73 double B[CLASS_SIZE]; const int nElements = 25 float C[nElements]; static char S[256]; linker */
CS-2303, C-Term 2010 Arrays in C & C++

/*not visible to
15

Declaring Arrays (continued)


Outside of any function always static
int A[13];
#define CLASS_SIZE 73 double B[CLASS_SIZE]; const int nElements = 25 float C[nElements]; static char D[256]; linker */
CS-2303, C-Term 2010 Arrays in C & C++

Static retains values across function calls

/*not visible to
16

Static Data Allocation


0xFFFFFFFF stack (dynamically allocated) SP

address space

heap (dynamically allocated) static data program code (text) PC

0x00000000

CS-2303, C-Term 2010

Arrays in C & C++

17

Declaring Arrays (continued)


Inside function or compound statement usually automatic
void f( ) {
int A[13]; #define CLASS_SIZE 73 double B[CLASS_SIZE]; const int nElements = 25 float C[nElements]; static char D[256]; /*static, not visible outside function */

} //f
CS-2303, C-Term 2010 Arrays in C & C++ 18

Static Data Allocation


0xFFFFFFFF stack (dynamically allocated) SP

address space

heap (dynamically allocated) static data program code (text) PC

0x00000000

CS-2303, C-Term 2010

Arrays in C & C++

19

Declaring Arrays (continued)


Inside function or compound statement usually automatic
void f( ) {
int A[13]; #define CLASS_SIZE 73 double B[CLASS_SIZE]; const int nElements = 25 float C[nElements]; static char D[256]; /*static, not visible outside function */

} //f
CS-2303, C-Term 2010 Arrays in C & C++ 20

Dynamic Array Size Determination


gcc supports the following:
void func(<other parameters>, const int n) { double Arr[2*n];

} //func

I.e., array size is determined by evaluating an expression at run-time


Automatic allocation on The Stack Not in C88 ANSI standard, not in Kernighan & Ritchie Part of C99 and C++
CS-2303, C-Term 2010 Arrays in C & C++ 21

Array Initialization
int A[5] = {2, 4, 8, 16, 32};
Static or automatic

int B[20] = {2, 4, 8, 16, 32};


Unspecified elements are guaranteed to be zero

int C[4] = {2, 4, 8, 16, 32};


Error compiler detects too many initial values

int D[5] = {2*n, 4*n, 8*n, 16*n, 32*n};


Automatically only; array initialized to expressions

int E[n] = {1};


gcc, C99, C++
Dynamically allocated array (automatic only). Zeroth element initialized to 1; all other elements initialized to 0
CS-2303, C-Term 2010 Arrays in C & C++ 22

Implicit Array Size Determination


int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
Array is created with as many elements as initial values
In this case, 12 elements

Values must be compile-time constants (for static arrays) Values may be run-time expressions (for automatic arrays) See p. 86 of K&R
CS-2303, C-Term 2010 Arrays in C & C++ 23

Getting Size of Implicit Array


sizeof operator returns # of bytes of memory

required by operand
See p.135 of K&R, 7.7 of D&D

Examples:
sizeof (int) # of bytes per int sizeof (float) # of bytes per float sizeof days # of bytes in array days (previous slide)
# of elements in days = (sizeof days)/sizeof(int)

Must be able to be determined at compile time


Getting size of dynamically allocated arrays not supported

CS-2303, C-Term 2010

Arrays in C & C++

24

Getting Size of Implicit Array


sizeof operator returns # of bytes of memory

required by operand
See p.135

Examples:
sizeof (int) # of bytes per int sizeof (float) # of bytes per float sizeof days # of bytes in array days (previous slide)
# of elements in days = (sizeof days)/sizeof(int)

Must be able to be determined at compile time


Getting size of dynamically allocated arrays not supported

CS-2303, C-Term 2010

Arrays in C & C++

25

Initializing a Two-Dimensional Array


static char daytab[2][12] = { {31,28,31,30,31,30,31,31,30,31,30,31}, {31,29,31,30,31,30,31,31,30,31,30,31} }; // daytab

OR
static char daytab[2][12] = { 31,28,31,30,31,30,31,31,30,31,30,31, 31,29,31,30,31,30,31,31,30,31,30,31 }; // daytab
CS-2303, C-Term 2010 Arrays in C & C++ 26

Questions?

CS-2303, C-Term 2010

Arrays in C & C++

27

Digression Memory Organization

0 1 2 3 4 5 6 7 8 9 10 11 2n-1

All modern processors have memories organized as sequence of numbered bytes


Many (but not all) are linear sequences Notable exception Pentium!

Definitions:
Byte: an 8-bit memory cell capable of storing a value in range 0 255 Address: number by which a memory cell is identified
CS-2303, C-Term 2010 Arrays in C & C++ 28

Memory Organization (continued)

0 1 2 3 4 5 6 7 8 9 10 11 2n-1

Larger data types are sequences of bytes e.g.,


short int 2 bytes int 2 or 4 bytes long 4 or 8 bytes float 4 bytes double 8 bytes

(Almost) always aligned to multiple of size in bytes Address is first byte of sequence (i.e., byte zero)
May be low-order or high-order byte Big endian or Little endian
CS-2303, C-Term 2010 Arrays in C & C++ 29

Definition Pointer
11 0 1 2 3 4 5 6 7 8 9 10 11

2n-1

A value indicating the number of (the first byte of) a data object
Also called an Address or a Location

Used in machine language to identify which data to access


E.g., stack pointer is address of most recent entry of The Stack

Usually 2, 4, or 8 bytes, depending upon machine architecture


CS-2303, C-Term 2010 Arrays in C & C++ 30

Memory Addressing
0xFFFFFFFF stack (dynamically allocated) SP

address space

heap (dynamically allocated) static data program code (text) PC

0x00000000

CS-2303, C-Term 2010

Arrays in C & C++

31

Pointers in C
Used everywhere
For building useful, interesting, data structures For returning data from functions For managing arrays

'&' unary operator generates a pointer to x


E.g., scanf("%d", &x); E.g., p = &c; Operand of '&' must be an l-value i.e., a legal object on left of assignment operator ('=')

Unary '*' operator dereferences a pointer


i.e., gets value pointed to E.g. *p refers to value of c (above) E.g., *p = x + y; *p = *q;
CS-2303, C-Term 2010 Arrays in C & C++ 32

Declaring Pointers in C
a pointer to an int double *q; a pointer to a double char **r; a pointer to a pointer to a
int *p;

char

type *s;

a pointer to an object of type type

E.g, a struct, union, function, something defined by a typedef, etc.

CS-2303, C-Term 2010

Arrays in C & C++

33

Declaring Pointers in C (continued)


Pointer declarations:read from right to left
const int *p;
p is a pointer to an integer constant I.e., pointer can change, thing it points to cannot

int * const q;
q is a constant pointer to an integer variable I.e., pointer cannot change, thing it points to can!

const int * const r;


r is a constant pointer to an integer constant
CS-2303, C-Term 2010 Arrays in C & C++ 34

Pointer Arithmetic
int *p, *q; q = p + 1;
Construct a pointer to the next integer after *p and assign it to q

double *p, *r; int n; r = p + n;


Construct a pointer to a double that is n doubles beyond *p, and assign it to r n may be negative
CS-2303, C-Term 2010 Arrays in C & C++ 35

Pointer Arithmetic (continued)


long int *p, *q; p++; q--;
Increment p to point to the next long int; decrement q to point to the previous long int

float *p, *q; int n; n = p q;


n is the number of floats between *p and *q; i.e., what would be added to q to get p
CS-2303, C-Term 2010 Arrays in C & C++ 36

Pointer Arithmetic (continued)


long int *p, *q; p++; q--;
Increment p to point to the next long int; decrement q to point to the previous long int

float *p, *q; int n; n = p q;


n is the number of floats between *p and *q; i.e., what would be added to q to get p
CS-2303, C-Term 2010 Arrays in C & C++ 37

Why introduce pointers in the middle of a lesson on arrays? Arrays and pointers are closely related in C
In fact, they are essentially the same thing! Esp. when used as parameters of functions

int A[10]; int *p;


Type of A is int * p = A; and A = p; are legal assignments *p refers to A[0] *(p + n) refers to A[n] p = &A[5]; is the same as p = A + 5;
CS-2303, C-Term 2010 Arrays in C & C++ 38

Arrays and Pointers (continued)


double A[10]; vs. double *A;

Only difference:
double A[10] sets aside ten units of memory, each large enough to hold a double, and A is initialized to

point to the zeroth unit. double *A sets aside one pointer-sized unit of memory, not initialized
You are expected to come up with the memory elsewhere!

Note: all pointer variables are the same size in any given machine architecture
Regardless of what types they point to
CS-2303, C-Term 2010 Arrays in C & C++ 39

Note
C does not assign arrays to each other E.g,
double A[10]; double B[10]; A = B;
assigns the pointer value B to the pointer value A

Original contents of array A are untouched (and possibly unreachable!)


CS-2303, C-Term 2010 Arrays in C & C++ 40

Arrays as Function Parameters


void init(float A[], int arraySize); void init(float *A, int arraySize);

Are identical function prototypes! Pointer is passed by value I.e. caller copies the value of a pointer to float into the parameter A Called function can reference through that pointer to reach thing pointed to
CS-2303, C-Term 2010 Arrays in C & C++ 41

Arrays as Function Parameters (continued)


void init(float A[], int arraySize){ int n; for(n = 0; n < arraySize; n++) A[n] = (float)n; } //init

Assigns values to the array A in place


So that caller can see the changes!
CS-2303, C-Term 2010 Arrays in C & C++ 42

Examples
while ((rc = scanf("%lf", &array[count])) !=EOF && rc!=0) double getLargest(const double A[], const int sizeA) { double d; if (sizeA > 0) { d = getLargest(&A[1], sizeA-1); return (d > A[0]) ? d : A[0]; } else return A[0]; } // getLargest
CS-2303, C-Term 2010 Arrays in C & C++ 43

Result
Even though all arguments are passed by value to functions pointers allow functions to assign back to data of caller Arrays are pointers passed by value

CS-2303, C-Term 2010

Arrays in C & C++

44

Safety Note
When passing arrays to functions, it is recommended to specify const if you dont want function changing the value of any elements Reason: you dont know whether your function would pass array to another before returning to you
Exception many software packages dont specify const in their own headers, so you cant either!
CS-2303, C-Term 2010 Arrays in C & C++ 45

Questions?

CS-2303, C-Term 2010

Arrays in C & C++

46

You might also like