# -*- mode: org -*-
#+HTML_HEAD:
#+BEGIN_cf
#+BEGIN_LEFT3
*Video:*
# RAM load too heavy
#+BEGIN_EXPORT html
#+END_EXPORT
[[https://youtube.com/shorts/bsS8VvaCSas]]
#+END_LEFT3
#+BEGIN_RIGHT6
*Overview:*
#+BEGIN_OVERVIEW
- *Terms to know:* Index, element, array, subscript operator,
initializer list, parallel arrays, multidimensional arrays
- *Concepts:*
- Why must an array's size be CONSTANT and known at compile-time?
- Minimum and maximum valid indices of an array given a size is...
- With a traditional array, we need to create separate variables
and named constants to store *array size* and
*total items stored in the array* if we want to work with these
numbers. Why?
- How do you use an integer variable to access an element of an
array at some index?
- How do you use a for loop to iterate over a 1D array? A 2D array?
- *New code:*
- Declare a traditional array: =TYPE ARRNAME[SIZE];=
- Declare an array with an initializer list: =TYPE ARRNAME[] = { ITEM1, ITEM2, ITEM3 };=
- Access an element of the array at index 0: =ARRNAME[0]=
- Display the item at element 2: =cout << ARRNAME[2];=
#+END_OVERVIEW
#+END_RIGHT6
#+END_cf
* *Array basics - what are arrays?*
In C++, arrays are a built-in way to store a series of similar data
all under one name.
Before now, if we wanted to store a list of students in a class (or
similar kind of data), we would have to declare a bunch of separate
variables and write the same code over and over to manage it:
*Example:* Creating separate variables for three students and
creating 3 different prompts and inputs for each variable
#+BEGIN_SRC cpp
string student1, student2, student3;
cout << "Enter student 1 name: ";
cin >> student1;
cout << "Enter student 2 name: ";
cin >> student2;
cout << "Enter student 3 name: ";
cin >> student3;
#+END_SRC
This would quickly become unmanageable if you were writing a program
with tens, hundreds, or thousands of students stored in it. Instead, we can make use of
*arrays* to store a series of related data together.
*Example:* Creating an array and asking the user to enter a value for every
element of the array
#+BEGIN_SRC cpp
string students[100];
for ( int i = 0; i < 100; i++ )
{
cout << "Enter student " << (i+1) << " name: ";
cin >> student[i];
}
#+END_SRC
Arrays allow us to operate on the same name (e.g., =student=), but addressing
different *elements* of the array with an *index* number. This way, we can
write code to act on the data /once/, just modifying that index to work with
different pieces of data.
*Example: student array of size 4:*
#+ATTR_HTML: :class arrayview
|-----------+-----+------+---------+------|
| *Element* | Rai | Anuj | Rebekah | Rose |
|-----------+-----+------+---------+------|
| *Index* | 0 | 1 | 2 | 3 |
|-----------+-----+------+---------+------|
Each item in the array has a corresponding *index* marking its position in the
list, with 0 being the first value. If an array is of size $n$, then the valid
indices are 0 through $n-1$.
An *element* is the information stored at that index position, which is
essentially a single variable in an array of variables.
#+BEGIN_REVIEW
*Review 1.* When we have a list of data to store, it is better to store
it as...
○ an array / ○ a bunch of separate variables
#+END_REVIEW
* *Using traditional (C-style) arrays*
** *Rules of traditional arrays*
*Array data types*
Arrays can be declared with any data type. To the computer, we are just
declaring $n$ amount of some variable, and it takes care of putting all the
=n= variables back-to-back in memory.
*First index is 0*
Most programming languages (but not all) have =0= as the first index
for arrays of items. (In the Lua programming language, we start at 1!)
#+BEGIN_REVIEW
*Review 2.* In C++, arrays begin at index: _______
#+END_REVIEW
#+BEGIN_REVIEW
*Review 3.* If we have access to indices =[0]=, =[1]=, and =[2]= in our
array, then how many /total/ elements are in the array? _______
#+END_REVIEW
*Size must be known at compile-time*
Traditional C-style arrays must have its size be defined during its declaration
and the array *cannot* be resized during the program's execution. Because the
array size can't change, and because we may need to know the size of the array
throughout the program, we will generally use a *named constant* to store the
size of the array.
#+BEGIN_SRC cpp
const int MAX_STUDENTS = 100;
string students[MAX_STUDENTS];
#+END_SRC
*Array size (const) vs. item count (variable)*
Because an array's size cannot be changed after its declaration, it often
becomes necessary to /overshoot/ the amount of spaces we need in the array so
that we always have enough room for our data. Perhaps a school's classrooms
range from 20 to 70 seats, so we would want to declare the array of the biggest
size so that we don't run out of space. Because of this, not all spaces in the
array may be taken up at any given time.
C++ doesn't have a function to directly get the amount of elements in an array,
so generally when declaring an array we need to also have an associated variable
to track how many items we've stored in the array.
*Example:* Declaring an array, storing a value for the element at index 0,
adding 1 to the item count
#+BEGIN_SRC cpp
const int MAX_STUDENTS = 100; // total array size
int studentCount = 0; // how many elements
string students[MAX_STUDENTS]; // array declaration
students[0] = "Rai"; // setting up first student
studentCount++; // adding 1 to student count
#+END_SRC
#+BEGIN_REVIEW
*Review 4.* If you're working with a traditional array, best practice is
to store its *size* in a...
#+ATTR_HTML: :style list-style-type: none;
- ○ integer variable /
- ○ named int constant
#+END_REVIEW
** *Array declaration*
In C++, we declare an array similarly to how we declare a variable, except
that we need to specify an array *size* during declaration:
*Example:* Declaring an array of strings of size 100
#+BEGIN_SRC cpp
// An array of size 100
string students[100];
#+END_SRC
Or, if we already have data to put into it, we can initialize it with an
*initializer list*. Then the array will be sized at however many items you
give it.
*Example:* Declaring an array of strings, initializing the data with an
initializer list
#+BEGIN_SRC cpp
// An array of size 4
string students[] = {"Rai", "Anuj", "Rebekah", "Rose"};
#+END_SRC
** *Accessing elements of an array*
*Valid indices*
As stated earlier, if an array is of size $n$, then its valid indices are 0 to
=n-1=. In most computer languages, arrays and lists start at index 0 and go up
from there, meaning to count for items we have "0, 1, 2, 3".
#+BEGIN_WARNING
*Warning!*
A common source of program crashes is *going outside the bounds of an array*!
This happens if you try to access an invalid index, such as =student[-1]=
or =student[100]= (for an array of size 100; valid indices are 0-99).
#+END_WARNING
*Accessing array elements via index*
After we've declared an array, we can treat its *elements* like normal
variables, storing data within it and accessing that data. Each one can be
accessed via its *index* (position in the array) and the *subscript operator*:
=[]=.
In math, you might be used to these subscripts:
$$ a_n = a_{n-1} + 2 $$
But with C++, subscripts look like this:
#+BEGIN_center
=a[n] = a[n-1] + 2=
#+END_center
So, declaring an array and accessing its values can look like this:
*Example:* Declaring an array and storing values for each element, displaying
the value of the element at index 0
#+BEGIN_SRC cpp
string courses[4];
courses[0] = "CS 134";
courses[1] = "CS 200";
courses[2] = "CS 210";
courses[3] = "ASL 120";
cout << "First course: " << courses[0] << endl;
#+END_SRC
Or, with modern C++ (from 2011 and later) you can initialize an array with an
initializer list, ={}=
*Example:* Using an initializer list to initialize an array's elements
#+BEGIN_SRC cpp
string courses[4] = {
"CS 134",
"CS 200",
"CS 210",
"ASL 120"
};
cout << "First course: " << courses[0] << endl;
#+END_SRC
#+BEGIN_HINT
*Design!*
It's common for *array names to be plural* - it is a structure that stores
/multiple items/ - multiple courses, multiple products, multiple grades, etc.
So, to be clear, it is best to give your arrays /plural/ names: =courses=,
=products=, =grades=, instead of singular.
#+END_HINT
#+BEGIN_REVIEW
*Review 5.* Given an array declared like this:
#+BEGIN_SRC cpp :class cpp
string cats[4];
#+END_SRC
The first element is at index ____ and the last element is at
index ____.
#+END_REVIEW
#+BEGIN_REVIEW
*Review 6.* Given this array:
#+ATTR_HTML: :class arrayview
|-----+------+------+-------+-------|
| [?] | [?] | [?] | [?] | [?] |
|-----+------+------+-------+-------|
| Kat | Kabe | Luna | Pixel | Korra |
|-----+------+------+-------+-------|
Assuming the /first/ item is on the /left/ and the /last/ item
is on the /right/, what is the element at index 3?
#+END_REVIEW
* *Arrays and memory*
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/addresses.png]]
When we declare any variable it is assigned a memory address as it is stored
somewhere in memory. You can think of this as it being stored in RAM (though
the operating system abstracts this a bit more). When a program starts and
variables are declared, space is taken up "in RAM" and then freed when the
program closes or when the variable is destroyed. This way, other programs
running in the operating system can utilize that space.
A memory address is a numeric value. Computers work on binary, but we often
write memory addresses in hexadecimal to shorten the length of the addresses.
An example memory address is: 0x7ffd1f7ba26c.
*Example:* Here's a simple program that creates two different variables,
assigns values, and outputs the values and their memory addresses:
#+BEGIN_SRC cpp
int main()
{
int num = 10;
string name = "Hello!";
cout << "The variable 'num' has a value of " << num
<< "\n at the address " << &num << endl << endl;
cout << "The variable 'name' has a value of " << name
<< "\n at the address " << &name << endl;
return 0;
}
#+END_SRC
When it is run, it will give output like this:
#+BEGIN_SRC terminal
The variable 'num' has a value of 10
at the address 0x7fff28b210bc
The variable 'name' has a value of "Hello!"
at the address 0x7fff28b210c0
#+END_SRC
*Contiguous addresses*
When a variable is declared, it will automatically have
space allocated in memory. For an array's elements, those elements
are going to be side-by-side in memory (contiguous).
Let's say we have an array of =bool= elements, which are 1 byte each.
If we declare it like this:
#+BEGIN_SRC cpp :class cpp
bool arr[4];
#+END_SRC
the address of each element might be something like...
#+BEGIN_SRC terminal :class terminal
Address of arr[0]: 0x7ffeeb9740d4
Address of arr[1]: 0x7ffeeb9740d5
Address of arr[2]: 0x7ffeeb9740d6
Address of arr[3]: 0x7ffeeb9740d7
#+END_SRC
The addresses would change each run, but they will always be 1 byte
apart in memory, since each =bool= is 1 byte big.
Let's also look at an array of integers. Each =int= is 4 bytes. We
declare it like this:
#+BEGIN_SRC cpp :class cpp
int arr[4];
#+END_SRC
the address of each element might be something like...
#+BEGIN_SRC terminal :class terminal
Address of arr[0]: 0x7ffded346a70
Address of arr[1]: 0x7ffded346a74
Address of arr[2]: 0x7ffded346a78
Address of arr[3]: 0x7ffded346a7c
#+END_SRC
Each element is still side-by-side in memory, but since each =int=
takes 4 bytes, each address is offset by 4. (0... 4... 8... then
c which is 12.)
#+BEGIN_REVIEW
*Review 7.* The elements of an array will be stored...
#+ATTR_HTML: :style list-style-type: none;
- ○ at random
- ○ side-by-side
... in memory.
#+END_REVIEW
* *Design patterns*
Since arrays require quite a bit of management to work with, you could
implement some basic functions to do this management, instead of having to
re-write the same code over and over.
** *Storing array size and item count*
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/studentarray.png]]
Let's say we have our student array and a maximum amount of 22 seats:
#+BEGIN_SRC cpp
const int TOTAL_SEATS = 22;
string students[TOTAL_SEATS];
#+END_SRC
One design consideration to think about here is that, if we iterate from i = 0
to =TOTAL_SEATS=, we're going to iterate over seats that have students AND seats
that are empty. What if we were writing a program and JUST wanted to display a
list of students enrolled in the course, and not waste paper space or screen
space drawing blank links for empty seats?
In this case we usually need to keep a variable to track how many items we're
actually storing in the array. For example:
#+BEGIN_SRC cpp
int studentCount;
#+END_SRC
so the =TOTAL_SEATS= would be the size of the array, but the studentCount might
be less than or equal to that number. Every time we added a student we would
add +1 to the studentCount. That way, we could use studentCount in our for loop
to display just active students, none of the empty seats.
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/studentarray2.png]]
... The =TOTAL_SEATS= remain the same, even as the =studentCount= grows from
more students taking up space in available seats...
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/studentarray3.png]]
#+BEGIN_REVIEW
*Review 8.* Let's say we have our array of students and the =TOTAL_SEATS=
is 22, and the =studentCount= begins at 0.
After three students register for the course, then
=TOTAL_SEATS= value is: ____ and =studentCount= value is: ____
#+END_REVIEW
** *Accessing indices with variables*
Since the array *index* is always an integer, we could use a variable to
determine which item in an array to modify - such as asking the user which item
they want to edit.
*Example:* Asking the user to enter an index and displaying the
element at that index
#+BEGIN_SRC cpp
cout << "Edit which item? (0-9): ";
cin >> itemIndex;
cout << "Enter price for item: ";
cin >> prices[ itemIndex ];
#+END_SRC
** *Asking the user to enter all elements*
Using for loops is the most common way to iterate over all the data in an
array, setting data or accessing data. Have an array of size =n=? We want to
iterate from =i= = 0 to $n-1$, going up by 1 each time.
We can iterate over all the items in an array and have the user enter
information for each element by using a loop. Since the first index is 0, we
sometimes just add +1 to the index for the user's benefit, since people
generally aren't used to lists
starting at 0.
#+BEGIN_SRC cpp
const int TOTAL_ITEMS = 10;
float prices[TOTAL_ITEMS];
for ( int i = 0; i < TOTAL_ITEMS; i++ )
{
cout << "Enter price for item " << (i+1) << ": ";
cin >> prices[i];
}
#+END_SRC
** *Displaying all items in an array*
We can display all the elements of an array by using a loop as well, though we
usually /don't/ want to show /all elements/ of the array - usually just the
items we know we're storing data in. Recall that we usually will have an extra
integer variable to count how many items have actually been stored in the
array, which is different from the total array size.
#+BEGIN_SRC cpp
const int MAX_STUDENTS = 100;
int studentCount = 0;
string students[MAX_STUDENTS];
// (...Let's say 20 students were added here...)
// Iterate from index 0 to 19, since we have stored
// 20 students so far.
for ( int i = 0; i < studentCount; i++ )
{
cout << "Student " << (i+1)
<< " is " << students[i] << endl;
}
#+END_SRC
You can also use a *range-based for loop* in versions of C++ from 2011 or later:
#+BEGIN_SRC cpp
for ( auto & student : students )
{
cout << student << endl;
}
#+END_SRC
** *Clear array*
Sets all elements of this string array to an empty string and resets
the =elementCount= to 0 afterwards.
*Example:* Iterating over an array and setting each element's value to 0
#+BEGIN_SRC cpp
void Clear( string arr[], int & elementCount )
{
for ( int i = 0; i < elementCount; i++ )
{
arr[i] = "";
}
elementCount = 0;
}
#+END_SRC
** *Add new element to array*
Often in our programs we will only set up one item at a time (perhaps when
selected from a menu). This means we need to get the data for the array and
figure out where in the array it will go.
#+BEGIN_SRC cpp
void AddItem( string arr[], int & elementCount )
{
cout << "Enter new element: ";
cin >> arr[ elementCount ];
elementCount++;
}
#+END_SRC
For an array, =elementCount= starts at 0 when the array is empty. This also
happens to be the *index* where we will insert our first element - at 0.
#+ATTR_HTML: :class arrayview
|-----------+---+---+---+---|
| *Element* | | | | |
| *Index* | 0 | 1 | 2 | 3 |
|-----------+---+---+---+---|
Once we add our first element, our =elementCount= will be 1, and the next index
to insert data at will also be 1.
#+ATTR_HTML: :class arrayview
|-----------+------+---+---+---|
| *Element* | Cats | | | |
| *Index* | 0 | 1 | 2 | 3 |
|-----------+------+---+---+---|
Then, =elementCount= will be 2, and the next index to insert at will be 2.
#+ATTR_HTML: :class arrayview
|-----------+------+------+---+---|
| *Element* | Cats | Dogs | | |
| *Index* | 0 | 1 | 2 | 3 |
|-----------+------+------+---+---|
Because of this, the =elementCount= variable both tells us how many
items have been stored in the array /and/ what is the next index to
store new information at.
#+BEGIN_REVIEW
*Review 9.* If we had an array declared like this:
#+BEGIN_SRC cpp :class cpp
string names[5];
#+END_SRC
The for loop header to iterate over all the elements would look
like...
=for( ________________ ; ________________ ; ________________ )=
#+END_REVIEW
#+BEGIN_REVIEW
*Review 10.* What does the following code snippet do?
#+BEGIN_SRC cpp :class cpp
for ( int i = 0; i < ARRAY_SIZE; i++ )
{
employeeWage[i] += 5.12;
}
#+END_SRC
#+ATTR_HTML: :style list-style-type: none;
- ○ Iterates over all elements in the employeeWage array and adds 5.12 to each item.
- ○ Iterates over all elements in the employeeWage array and displays each element's value to the screen.
- ○ Iterates over all elements in the employeeWage array and overwrites each element with a value of 5.12.
#+END_REVIEW
** *Parallel arrays*
Let's say we're writing a simple restaurant program where we need a list of
dishes /and/ their prices together. Later on, we will write our own data type
using *structs and classes* to keep these items together. But for now, we
would implement this relationship by keeping track of two separate arrays with
the data we need.
This is an option, design-wise, however usually it's better to store
the two arrays within a /structure/ or /class/ instead of making
parallel arrays.
*Example:* Using 3 parallel arrays to store a dish's name, price, and if
its vegetarian
#+BEGIN_SRC cpp
const int MAX_DISHES = 20;
int dishCount = 0;
// Information about a dish
string dishNames[MAX_DISHES];
float dishPrices[MAX_DISHES];
bool dishVegetarian[MAX_DISHES];
// ... Let's say we created some dishes here...
// Display the menu
cout << "What would you like to order?" << endl;
for ( int i = 0; i < dishCount; i++ )
{
cout << "Dish #" << i << ":" << endl;
cout << "* Name: " << dishNames[i] << endl;
cout << "* Price: $" << dishPrices[i] << endl;
if ( dishVegetarian[i] ) {
cout << "* Is vegetarian" << endl;
}
cout << endl;
}
// Get the index of dish they want
int whichDish;
cout << "Selection: ";
cin >> whichDish;
#+END_SRC
* *Multidimensional arrays*
We can declare an array with two dimensions. A 1 dimensional array we can think
of like this:
#+ATTR_HTML: :class arrayview
|-------+-------+-------+-------+-------|
| CS134 | CS200 | CS210 | CS211 | CS235 |
|-------+-------+-------+-------+-------|
Whereas a 2 dimensional array we can think of like a spreadsheet with
multiple rows and columns:
#+ATTR_HTML: :class arrayview
|-------+-------------+----+---|
| CS134 | Spring 2022 | PW | A |
| CS200 | Summer 2022 | RS | A |
| CS235 | Fall 0222 | RS | A |
|-------+-------------+----+---|
Or even as a 2D display on a screen with an (x, y) position for pixels:
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/pixelarray.png]]
Generally when talking about rows and columns, rows comes first and columns
come second.
Row is a horizontal grouping of information, a column is a vertical grouping of
information. On a spreadsheet, a "cell" is a single item denoted by a row and
a column.
[[http://rachel.likespizza.com/courses/_images/bytopic/arrays/rowscols.png]]
Often, the *column* relates to a specific field of data (such as a student's
name, age, gpa, etc.) - Think of a struct and its member variables.
Then, each *row* corresponds to one record. So if we had an array of students,
each row would be student 0, 1, 2, 3, etc. and then each column would be name,
age, gpa, etc.
** *Example: Displaying all the elements of a 2D array*
To display the contents of a 2D array, it can be useful to have two for loops,
one nested in the other. The outer for loop will only increment once the inner
one finishes its cycle. I usually put the *rows* as the outer loop and the
*columns* as the inner-loop.
#+BEGIN_SRC cpp
for ( int row = 0; row < ROWS; row++ )
{
cout << "Row: " << row << endl;
for ( int col = 0; col < COLUMNS; col++ )
{
cout << "\t Col: " << col
<< ": " << arr[row][col]
<< endl;
}
}
#+END_SRC
** *Example: Declaring a 2D and a 3D array*
#+BEGIN_SRC cpp
string spreadsheet[32][32]; // rows and columns
int vertices[4][4][4]; // x, y, z
#+END_SRC
Let's say we wanted to turn a day planner into a program. Perhaps we
originally stored the day plan like this:
#+ATTR_HTML: :style margin: 20px auto;
| Day | Time | Task |
|-----------+-------+-----------------------|
| Monday | 8:00 | Work meeting with Bob |
| Monday | 13:00 | Project review |
| Tuesday | 10:00 | Customer meeting |
| Tuesday | 12:00 | Crying in car |
| Wednesday | 14:00 | Sprint Retrospective |
We can convert this into a 2D array of strings (the "task"), with one dimension
being for "day of the week" and the other dimension being for "hour of the
day"...
** *Example: Declaring a 2D array of strings*
#+BEGIN_SRC cpp
int DAYS_OF_WEEK = 7;
int HOURS_IN_DAY = 24;
string todo[ DAYS_OF_WEEK ][ HOURS_IN_DAY ];
#+END_SRC
We could ask the user what day they want to set a task for, and if they type
"Sunday" that could translate to 0, and "Saturday" could translate to 6 (or
however you want to organize your week)...
#+ATTR_HTML: :class arrayview
|--------+--------+---------+-----------+----------+--------+----------|
| Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday |
|--------+--------+---------+-----------+----------+--------+----------|
| 0 | 1 | 2 | 3 | 4 | 5 | 6 |
|--------+--------+---------+-----------+----------+--------+----------|
We could ask them next for what hour the task is at, and that can map to the
second index: "0" for midnight, "8" for 8 am, "13" for 1 pm, and so on to 23.
With this information, we can get the user's todo task and store it at the
appropriate indices:
** *Example: Asking the user to enter a day and hour and using those as indices*
#+BEGIN_SRC cpp
int day, hour;
cout << "Enter the day:" << endl;
cout << "0. Sunday \n"
<< "1. Monday \n"
<< "2. Tuesday \n"
<< "3. Wednesday \n"
<< "4. Thursday \n"
<< "5. Friday \n"
<< "6. Saturday \n";
cout << "Day: ";
cin >> day;
cout << "Enter the hour (0 to 23): ";
cin >> hour;
cout << "Enter your task: ";
cin >> todo[ day ][ hour ];
#+END_SRC
With the user's week planned out, you could then display it back to the user by
using a *nested for loop*: One loop for the day, one loop for the hour.
** *Example: Nested for loop to display all elements of the 2D array*
#+BEGIN_SRC cpp
cout << "YOUR SCHEDULE" << endl;
for ( int day = 0; day < DAYS_OF_WEEK; day++ )
{
for ( int hour = 0; hour < HOURS_IN_DAY; hour++ )
{
cout << day << ", "
<< hour << ": "
<< todo[ day ][ hour ] << endl;
}
}
#+END_SRC
Though you'd probably want to do some extra formatting; such as determining
that if the day is 0, then write "Sunday" instead of the number "0".
#+BEGIN_REVIEW
*Review 11.* Even with a 2-dimensional array each element is still the
same data type. You declare a 2d array similarly to a 1d array,
but with an extra size:
#+BEGIN_SRC cpp :class cpp
const int ROWS = 10;
const int COLUMNS = 3;
string spreadsheet[ROWS][COLUMNS];
#+END_SRC
Given 10 rows and 3 columns, how many elements would this be?
#+END_REVIEW
#+BEGIN_REVIEW
*Review 12.* To display the contents of a 2D array, it can be useful to
have two for loops, one nested in the other. The outer for loop
will only increment once the inner one finishes its cycle.
Given the following 2D array declaration:
#+BEGIN_SRC cpp :class cpp
const int ROWS = 3;
const int COLUMNS = 4;
string pixelColors[ROWS][COLUMNS];
#+END_SRC
How would you create for loops that will display the element
data like this?
#+BEGIN_SRC terminal :class terminal
Row: 0
Col: 0: #00ffff
Col: 1: #ff00ff
Col: 2: #000000
Col: 3: #00ff00
Row: 1
Col: 0: #000000
Col: 1: #00ffff
Col: 2: #ff0000
Col: 3: #0000ff
Row: 2
Col: 0: #000000
Col: 1: #ffff00
Col: 2: #ff0000
Col: 3: #00ff00
#+END_SRC
#+END_REVIEW
* *Common errors*
What happens if we have an array declared like this:
#+BEGIN_SRC cpp :class cpp
float prices[5];
#+END_SRC
But we try to access an index that it outside its range, like...
#+BEGIN_SRC cpp :class cpp
cout << prices[-1];
cout << prices[100];
#+END_SRC
If this occurs, this is an out of bounds error, and will cause the
program to crash! So now we have a very reliable way to crash our
programs now. :)
#+BEGIN_REVIEW
*Review 13.* Given the array declaration:
#+BEGIN_SRC cpp :class cpp
int myArr[10];
#+END_SRC
Are any of the following out of bounds?
- =myArr[0]= is ○ OK / ○ Out-of-bounds
- =myArr[5]= is ○ OK / ○ Out-of-bounds
- =myArr[10]= is ○ OK / ○ Out-of-bounds
- =myArr[11]= is ○ OK / ○ Out-of-bounds
#+END_REVIEW
# ----------------------------------------------------------------------
# * *Arrays with Functions: Arrays as arguments*
#
# they could potentially take up a lot of memory. Because of this, passing an
# array as a pass-by-value parameter would be inefficient - remember that
# pass-by-value means that the parameter is /copied/ from the caller argument.
#
# C++ automatically passes arrays around as *pass-by-reference* instead. You
# don't have to inclue the =&= symbol in your parameter list for an array, it
# just happens! But - keep in mind that any problems with pass-by-reference also
# apply to arrays. If you want to pass an array to a function but you *don't want
# the data changed*, then you would need to mark that array parameter as *const*.