#include <iostream>
void increment(int a) {
a = a + 5;
}
int main() {
int var = 5;
increment(var);
std::cout << var << std::endl;
}
#include <iostream>
void increment(int a) {
int c = 5;
a = a + 5;
}
int main() {
int d = 6;
int var = 5;
increment(var);
std::cout << var << std::endl;
}
#include <iostream>
void increment(int a) {
int c = 5;
a = a + 5;
}
int main() {
int d = 6;
int var = 5;
increment(var);
std::cout << var << std::endl;
}
#include <iostream>
void increment(int &a) {
a = a + 5;
}
int main() {
int var = 5;
increment(var);
std::cout << var << std::endl;
}
int main() {
int var = 5;
// TYPE* name;
int* var_ptr = &var;
}
int main() {
int var = 5;
// TYPE* name;
int* var_ptr = &var;
}
-> operator behind a pointer to deference and do something else#include <iostream>
int main() {
int var = 5;
// TYPE* name;
int* var_ptr = &var;
std::cout << *var_ptr << std::endl;
}
#include <iostream>
#include <string>
int main() {
int var = 5;
std::string s = "Pointers are fun";
// TYPE* name;
int* var_ptr = &var;
std::string* str_ptr = &s;
str_ptr->push_back('!');
std::cout << "var_ptr is " << *var_ptr << std::endl;
std::cout << "str_ptr has size " << str_ptr->size() << std::endl;
std::cout << "Now s is: " << s << std::endl;
}
type |
# bytes |
|---|---|
| char | 1 |
| int | 4 |
| double | 8 |
#include <iostream>
int main() {
int var = 6;
int* var_ptr = &var;
var_ptr += 1;
}
#include <iostream>
int main() {
char rj = 'c';
char* char_ptr = &rj;
char_ptr += 2;
}
int main() {
double *a = new double(10.0);
}
int main() {
double *a = new double(10.0);
// ... legit code
delete a;
}
int main() {
double *a = new double(10.0);
// ... legit code
delete a;
// .. more code
*a = 20.0
// .. more code
}
delete on its datashared_ptr: multiple shared_ptr objects can own a single pointerunique_ptr: only one unique_ptr can own an pointerunique_ptrint main() {
unique_ptr<object> u_ptr = make_unique<object>();
}
shared_ptrint main() {
shared_ptr<object> s_ptr1 = make_shared<object>();
// <--- HERE
{
shared_ptr<object> s_ptr2 = s_ptr1;
}
shared_ptr<object> s_ptr3 = s_ptr1;
}
shared_ptrint main() {
shared_ptr<object> s_ptr1 = make_shared<object>();
{
shared_ptr<object> s_ptr2 = s_ptr1;
// <--- HERE
}
shared_ptr<object> s_ptr3 = s_ptr1;
}
shared_ptrint main() {
shared_ptr<object> s_ptr1 = make_shared<object>();
{
shared_ptr<object> s_ptr2 = s_ptr1;
}
shared_ptr<object> s_ptr3 = s_ptr1;
// <--- HERE
}
B* old_var = new B(); // some object
A* new_var = (A*)old_var;
old_var as though it was of type Achar c = 10; // this is one byte in memory
int *p = (int*) &c; // this is a 4-byte pointer pointing to one byte of
// memory - it compiles but leads to corrupted memory
// if you try to write to what p points to
int *q = static_cast<int*>(&c); // throws an exception at compile time
static_cast is mostly used for basic type conversions, e.g. between different types of numbersdynamic_cast is mostly used for conversions between object types for polymorphismreinterpret_cast works like a C-style cast and generally shouldn't be used unless you know exactly what you're doingline_follow.cppturn_right and turn_leftturn_left(RJRobot r)
unique_ptr to an RJRobotmake_unique in mainunique_ptr in any functionrepeat forever: if (sensor < threshold) then turn_left, else turn_right