# Int Main()

## what is memory?

``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``int x``
``int z``
``int y``
``3``
``2``
``5``
``???``
``???``
``???``

# Int Main()

## what is memory?

``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``int x``
``int z``
``int y``
``3``
``2``
``5``
``???``
``???``
``???``

# Int Main()

## what is memory?

``````int foo()
{
int n = 3;
}

int main()
{
int x = 3;
int y = 2;
foo();
int z = 5;
}``````
``int x``
``int y``
``3``
``2``
``???``
``???``

# Int FOO()

``int n``
``3``
``???``

# Int Main()

## what is memory?

``````int foo()
{
int n = 3;
}

int main()
{
int x = 3;
int y = 2;
foo();
int z = 5;
}``````
``int x``
``int y``
``3``
``2``
``???``
``???``

# Int FOO()

``int n``
``3``
``???``
``int z``
``5``
``???``

# Int Main()

## what is memory?

``````int foo()
{
int n = 3;
}

int main()
{
int x = 3;
int y = 2;
foo();
int z = 5;
}``````
``int x``
``int z``
``int y``
``3``
``2``
``5``
``???``
``???``
``???``

# the stack

## what is memory?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``````???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???``````

# *x86 register names

`esp`

## what is memory?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``````0
0
0
3
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???
???``````

`esp`

# the stack

## what is memory?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``````0
0
0
3
0
0
0
2
???
???
???
???
???
???
???
???
???
???
???
???
???``````

`esp`

# the stack

## what is memory?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``````0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???``````

`esp`

# the stack

## what is memory?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````int main()
{
int x = 3;
int y = 2;
int z = 5;
}``````
``````0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???``````

`esp`

# the stack

## what is endianness?

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````3
0
0
0
2
0
0
0
5
0
0
0
???
???
???
???
???
???
???
???
???``````

# memory

``````ebp + 0x00
ebp + 0x01
ebp + 0x02
ebp + 0x03
ebp + 0x04
ebp + 0x05
ebp + 0x06
ebp + 0x07
ebp + 0x08
ebp + 0x09
ebp + 0x0a
ebp + 0x0b
ebp + 0x0c
ebp + 0x0d
ebp + 0x0e
ebp + 0x0f
ebp + 0x10
ebp + 0x11
ebp + 0x12
ebp + 0x13
ebp + 0x14
``````
``````0
0
0
3
0
0
0
2
0
0
0
5
???
???
???
???
???
???
???
???
???``````

# memory

## size

`char`
`short`
`int`
`long long`

# memory

## size

`char`
`short`
`int`
`long long`

# memory

```sizeof(char) == 1
alignof(char) == 1```

## size

`char`
`short`
`int`
`long long`

# memory

```sizeof(short) == 2
alignof(short) == 2```

## size

`char`
`short`
`int`
`long long`

# memory

```sizeof(int) == 4
alignof(int) == 4```

## size

`char`
`short`
`int`
`long long`

# memory

```sizeof(long long) == 8
alignof(long long) == 8```

# memory

``````struct my_data
{
short s1;
short s2;
int x;
} my_object;``````
```sizeof(my_data) == ...
alignof(my_data) == ...```

# memory

``````struct my_data
{
short s1;
short s2;
int x;
} my_object;``````
```sizeof(my_data) == 8
alignof(my_data) == ...```
`my_object.s1`
`my_object.s2`
`my_object.x`

# memory

``````struct my_data
{
short s1;
short s2;
int x;
} my_array[2];``````
```sizeof(my_data) == 8
alignof(my_data) == 8```
`my_array[0].s1`
`my_array[0].s2`
`my_array[0].x`
`my_array[1].s1`
`my_array[1].s2`
`my_array[1].x`

# memory

``````struct my_data
{
short s1;
int x;
short s2;
} my_object;``````
```sizeof(my_data) == ...
alignof(my_data) == ...```

# memory

``````struct my_data
{
short s1;
int x;
short s2;
} my_object;``````
```sizeof(my_data) == ...
alignof(my_data) == ...```
`my_object.s1`
`my_object.s2`
`my_object.x`

# memory

``````struct my_data
{
short s1;
int x;
short s2;
} my_object;``````
```sizeof(my_data) == 10???
alignof(my_data) == ...```
`padding`
`my_object.s1`
`my_object.s2`
`my_object.x`

# memory

``````struct my_data
{
short s1;
int x;
short s2;
} my_array[2];``````

## size

`padding`
```sizeof(my_data) == 10???
alignof(my_data) == ...```
`my_array[0].s1`
`my_array[0].s2`
`my_array[0].x`

# memory

## size

``````struct my_data
{
short s1;
int x;
short s2;
} my_array[2];``````
```sizeof(my_data) == 10???
alignof(my_data) == ...```
`my_array[0].s1`
`my_array[0].s2`
`my_array[0].x`
`my_array[1].s1`
`my_array[1].s2`
`my_array[1].x`

# memory

## size

``````struct my_data
{
short s1;
int x;
short s2;
} my_array[2];``````
```sizeof(my_data) == 12
alignof(my_data) == 4```
`my_array[1].s1`
`my_array[1].s2`
`my_array[1].x`
`my_array[0].s1`
`my_array[0].s2`
`my_array[0].x`

# memory

## size

``````struct my_data
{
short s1;
int x;
short s2;
} my_object;``````
```sizeof(my_data) == 12
alignof(my_data) == 4```
`my_object.s1`
`my_object.s2`
`my_object.x`

## size

sizeof(type)

sizeof(expression)

``````//sizeof(int) == 4

short s;
//sizeof(s) == 2

//sizeof('a') == 1``````
``````//alignof(int) == 4

short s;
//alignof(s) == 2

//alignof('a') == 1``````

alignof(type)

alignof(expression)

alignas(type)

alignof(aligment)

``````alignas (int) short x;
// alignof(x) == 4
// alignof(decltype(x)) == 2

alignas (128) int n;
// alignof(n) == 128
// alignof(decltype(n)) == 4``````

## what are bitfields?

``````#include <cstdint>

{
unsigned version : 4;
unsigned ihl : 4;
unsigned dscp : 6;
unsigned ecn : 2;
uint16_t total_length;
uint16_t identification;
unsigned flags : 3;
unsigned fragment_offset : 13;
uint8_t time_to_live;
uint8_t protocol;
uint64_t options_upper;
uint64_t options_lower;
}``````
``````int8_t x1; // 8 bits
int16_t x2; // 16 bits
int32_t x3; // 32 bits
int64_t x4; // 64 bits

int b1 : 9; // 9 bits
int b2 : 13; // 13 bits;
int b3 : 120; // error: 120 bits > #int_bits``````

## what are bitfields?

``````#include <cstdint>

{
unsigned version : 4;
unsigned ihl : 4;
unsigned dscp : 6;
unsigned ecn : 2;
uint16_t total_length;
uint16_t identification;
unsigned flags : 3;
unsigned fragment_offset : 13;
uint8_t time_to_live;
uint8_t protocol;
uint64_t options_upper;
uint64_t options_lower;
}``````

`=`
`Data`

## object

``````sizeof(name)
``````
``````alignof(name)
``````
``.................``
``````decltype(name)
``````
``````name
``````
``#name``
``.................``
``size``
``aligment``
``storage class``
``type``
``value``
``name``
``lifetime``
`(different than typeid(name))`
`(optional)`
`(may be undefined)`
``````sizeof(name)
``````
``````alignof(name)
``````
``.................``
``````decltype(name)
``````
``````name
``````
``#name``
``.................``
``size``
``aligment``
``storage class``
``type``
``value``
``name``
``lifetime``
`(different than typeid(name))`
`(optional)`
`(may be undefined)`

## object

``````"          " : {
"memory_locations" : [
"location_1" : {
"subobject" : { ... } or "bitfields" : [...]
},
"location_2" : {
"subobject" : { ... } or "bitfields" : [...]
},
"location_3" : {
"subobject" : { ... } or "bitfields" : [...]
},
...,
"location_N" : {
"subobject" : { ... } or "bitfields" : [...]
},
]
}``````

## object

``````struct my_type {
int x;
char b;
int f0 : 3;
int f1 : 2;
int f2 : 7;
int : 0;
int f3 : 27;
std::string s;
} data;``````

`data`

`data`

## Is

``````   sizeof(data) ==
&& alignof(data) ==
&& std::is_same_v<decltype(data), my_data>()``````

`x`
`b`
`f0`
```f1
```
`f2`
`s`
`f3`

memory location

object

# data

`x`
`b`
`f0`
```f1
```
`f2`
`s`
`f3`

memory location

`address`

object

`address`

object

## pointers

`(addresses)`

Prototype

Dereference operator

Member access operator

`Type*`
`&object`
`*pointer`
`pointer->member`
``````struct type
{
int member1;
bool member2;
}

type object = {1, true};

type* obj_ptr = &object;
(*obj_ptr) = {0, false};
obj_ptr->member12 = true;``````

## pointers

`(addresses)`

Prototype

Dereference operator

Member access operator

`Type*`
`&object`
`*pointer`
`pointer->member`
``````int arr[3] = {1, 2, 3};

int* arr_ptr = arr;
arr_ptr + 2 == &arr[2];
*(&arr[10] - 9) == 2;``````

# Array

`arr[0]`
`arr[1]`
`arr[2]`

## pointers

`(addresses)`

Prototype

Dereference operator

Member access operator

`Type*`
`&object`
`*pointer`
`pointer->member`
``````const char* greeting = "Hi!";

greeting[0] == 'H';
greeting[3] == '\0';
*(greeting + 2) == '!';
*(&greeting[1]) == *(greeting + 1);``````

## STRings as

`"Hi!"`
`char[4]{'H', 'i', '!', '\0'}`
`=`

## pointers

`(addresses)`

Prototype

Dereference operator

Member access operator

`Type*`
`&object`
`*pointer`
`pointer->member`
``````int arr[5] = {1, 2, 3, 4, 5};
int* ptr_to_array = arr;
int** ptr_to_ptr_to_array = &ptr_to_array;
int*** ptr_to_ptr_to_ptr_to_array = &ptr_to_array;
int**** ptr_to_ptr_to_ptr_to_ptr_to_array = &ptr_to_array;
...``````

## pointers

`(addresses)`
``````#include <iostream>

int* find_number_in_array(int* arr, int size, int number)
{
for (int i = 0; i < size; ++i)
{
if (arr[i] == number)
{
return arr + i;
}
}
return nullptr;
}

int main()
{
int arr[5] = {1, 2, 3, 4, 5};

int desired;
std::cin >> desired;

int* found = find_number_in_array(arr, 5, desired);
if (found) // found != nullptr
{
std::cout << "Found number at position " << found - arr;
}
else
{
}
}``````

By Jan Bielak

# Memory and Pointers

A presentation about the memory and pointers in C++. It is presented here: https://www.youtube.com/watch?v=CSKsKfSJq6w .

• 477