10.1 Array
10.1 Array
Lecture 25 array
Arrays
A
C-style arrays
Before
In
Array declaration
type name[size];
int a[5];
char b[10];
Cat c[7]; // user-defined
class
Array initialization
A
A pointer
int a[5];
Actually,
It
array a is a pointer.
Address
Value Stored
0034F8D8
(Unknown)
0034F8DC
(Unknown)
0034F8E0
Garbage
0034F8E4
Garbage
0034F8E8
Garbage
0034F8EC
Garbage
0034F8F0
Garbage
0034F8F4
(Unknown)
0034F8F8
(Unknown)
A pointer
int a[5];
Actually,
array a is a pointer.
It
And
since a is a pointer, we
can perform arithmetic, so
a+2 points to
Address
Value Stored
0034F8D8
(Unknown)
0034F8DC
(Unknown)
0034F8E0
Garbage
0034F8E4
Garbage
0034F8E8
Garbage
0034F8EC
Garbage
0034F8F0
Garbage
0034F8F4
(Unknown)
0034F8F8
(Unknown)
A pointer
int a[5];
Array
a is a special type of
pointer that we can refer to
but we cannot change the
value of a.
a = a+2; // ERROR!
Address
Value Stored
0034F8D8
(Unknown)
0034F8DC
(Unknown)
0034F8E0
Garbage
0034F8E4
Garbage
0034F8E8
Garbage
0034F8EC
Garbage
0034F8F0
Garbage
0034F8F4
(Unknown)
0034F8F8
(Unknown)
A helper
Address
Value Stored
0034F8D8
(Unknown)
0034F8DC
(Unknown)
0034F8E0
Garbage
0034F8E4
Garbage
0034F8E8
Garbage
0034F8EC
Garbage
0034F8F0
Garbage
int* p = a+3;
0034F8F4
(Unknown)
++p;
0034F8F8
(Unknown)
int a[5];
Even
++p;
Out of bounds
Address
Value Stored
0034F8D8
(Unknown)
int a[5];
0034F8DC
(Unknown)
0034F8E0
Garbage
int* p = a+3;
++p;
++p; // This is fine as
long as you dont
dereference.
cout<<*p<<endl; // logic
ERROR
0034F8E4
Garbage
0034F8E8
Garbage
0034F8EC
Garbage
0034F8F0
Garbage
0034F8F4
(Unknown)
0034F8F8
(Unknown)
We
The
addresses increment by 8
bytes to reflect the larger data
type.
double* p = a+3;
++p;
++p;
Address
Value Stored
0034F8D0
(Unknown)
0034F8D8
(Unknown)
0034F8E0
Garbage
0034F8E8
Garbage
0034F8F0
Garbage
0034F8F8
Garbage
0034F900
Garbage
0034F908
(Unknown)
0034F910
(Unknown)
double a[5];
The
a[n] == *(a+n)
returns true. In other words, arrays really are just const
pointers and are interpreted as such.
The
We
The
int main() {
double a[5];
cout<<one double = <<sizeof(a[0])<<
bytes\n;
cout<<array of 5 doubles = <<sizeof(a)<<
bytes\n;
cout<<When passed in, array has size ;
arraySize(a);
}
the sizeof()
function doesnt work
when we pass an array
into a function.
array gets converted
to an ordinary pointer and
only returns the number
of bytes of a single data
type, in this case 8 bytes.
Usually
we need to pass
the size of the array to
the function!
A history lesson
In
arrays have a \0
character that signifies the
end of the sequence of
characters.
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
0034F8DC
0034F9DD
\0
0034F9DE
(Unknown)
0034F9DF
(Unknown)
char arrays
char name[] = John;
char refers to the data type of each element
name is the variable name
[] means that name is an array of values.
char arrays
char name[] = John;
John is initially stored as a const char* in some
temporary location in memory.
= copies the characters in John, which is stored in
some temporary location, to the locations pointed to by
array name. So name points to a char J and the
subsequent letters in John are stored consecutively in
memory.
This is a shorthand for
char name[5] = { J, o, h, n, \0};
Shared Memory
string s = Harry;
string t = s;
t[0] = L;
Each
string is a separate
object, and setting t=s copies
all of the characters from s
into t.
character array, on the other
hand, is defined using
pointers, and so m and n point
to the same character in
memory.
string s = Harry;
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
0034F8DC
0034F9DD
0034F9F9
(Unknown)
0034F9FA
(Unknown)
0034F9FB
(Unknown)
0034F9FC
(Unknown)
0034F9FD
(Unknown)
0034F9FE
(Unknown)
0034F9FF
(Unknown)
0034FA00
(Unknown)
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
string s = Harry;
0034F8DB
string t = s;
0034F8DC
0034F9DD
0034F9F9
(Unknown)
0034F9FA
0034F9FB
0034F9FC
0034F9FD
0034F9FE
0034FA1A
(Unknown)
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
string s = Harry;
0034F8DB
string t = s;
0034F8DC
0034F9DD
0034F9F9
(Unknown)
0034F9FA
0034F9FB
0034F9FC
0034F9FD
0034F9FE
0034FA1A
(Unknown)
t[0] = L;
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
(Unknown)
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
char* m = n;
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
0034F8D9
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
char* m = n;
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
0034F8D9
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
m[0] = L;
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
char* m = n;
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
0034F8D9
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
m[0] = L;
m[4] = s;
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
char* m = n;
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
0034F8D9
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
m[0] = L;
m[4] = s;
n[3] = x;
Address
Value Stored
0034F8D7
(Unknown)
0034F8D8
(Unknown)
0034F8D9
0034F8DA
0034F8DB
char* m = n;
0034F8DC
0034F9DD
0034F9DE
\0
0034F9DF
(Unknown)
0034F9E0
0034F8D9
0034F9E1
0034F8D9
0034F9E2
(Unknown)
0034F9E3
(Unknown)
0034F9E4
(Unknown)
0034F9E5
(Unknown)
0034F9E6
(Unknown)
m[0] = L;
m[4] = s;
n[3] = x;
m[3] = y;
1.The
2.The
3.Both,
const int* p
The pointer cannot change the value of the contents
that it is pointing to.
. This follows the standard convention of placing const
in front of a variable type.
1.
int* const p
2. The pointer itself cannot change value. Whatever
location in memory it initially points to it cannot
change value.