int v[] = {0,1,2,3,4,5,6,7,8,9};
for (auto x : v}
cout << x << '\n';
for (auto& x : v)
cout << x << '\n';
The first places a copy of elements into x whereas the second does not.
Check null pointer:
int count_x(char* x, char x)
// count the number of occurrence of x in p[]
// p assumed to point to a zero-terminated array of char
// (or to nothing)
{
if (p==nullptr) return 0;
int count = 0;
for (; *p!=0; ++p)
if (*p==x) ++count;
return count;
}
struct Vector{
int sz;
double* elem;
};
Vector v;
void vector_init(Vector& x, int s)
// x is passed as a non-const reference
{
v.elem = new double[s];
v.sz = s;
}
A simple Vector:
double read_and_sum(int s)
{
Vector v;
vector_init(v,s);
for (int i=0; i<s; ++i)
cin >> v.elem[i];
double sum {0};
for (int i=0; i<s; ++i)
sum += v.elem[i];
return sum;
}
We use . to access struct members through a name (and through a reference) and -> to access struct members through a pointer.
void f(Vector v, Vector& rv, Vector* pv)
{
int i1 = v.sz;
int i2 = rv.sz;
int i4 = pv->sz;
}
Enumerations with scope:
enum class Color { red, blue, green };
enum class Traffic_light {green, yellow, red};
int main()
{
Color col = Color::red;
Traffic_light light = Traffic_light::red;
}