// ---------------
// StackArrays.c++
// ---------------
#include <algorithm> // copy, count, fill
#include <cassert> // assert
#include <cstddef> // ptrdiff_t, size_t
#include <iostream> // cout, endl
const std::size_t s = 10;
const int v = 2;
void f (int p[]) {
assert(sizeof(p) == 4);
++p;
++p[0];
++*p;}
void g (int* p) {
assert(sizeof(p) == 4);
++p;
++p[0];
++*p;}
int main () {
using namespace std;
cout << "StackArrays.c++" << endl;
{
int a[] = {2, 3, 4};
assert(*a == a[0]);
assert(a == &a[0]);
assert(sizeof(a) != sizeof(&a[0]));
assert(sizeof(a) == 12);
assert(sizeof(&a[0]) == 4);
// ++a; // error: lvalue required as left operand of assignment
++a[0];
assert(*a == 3);
// assert(a[3] == 0); // undefined
}
{
const int a[s] = {2, 3, 4};
assert(a[1] == 3);
assert(*(a + 1) == 3);
assert(a[s - 1] == 0);
// ++a; // error: lvalue required as left operand of assignment
// ++a[1]; // error: increment of read-only location
}
{
// const int a[s]; // error: uninitialized const 'a'
int a[s];
// assert(a[0] == 0); // undetermined
}
{
const int a[s] = {};
assert(a[0] == 0);
}
{
int a[] = {2, 3, 4};
assert(a[1] == 3);
f(a);
assert(a[1] == 5);
g(a);
assert(a[1] == 7);
}
{
int a[] = {2, 3, 4};
assert(a[1] == 3);
// int b[] = a; // error: initializer fails to determine size of 'b'
int* const p = a;
assert(&a[1] == &p[1]);
assert(sizeof(a) != sizeof(p));
assert(sizeof(a) == 12);
assert(sizeof(p) == 4);
const size_t t = sizeof(a) / sizeof(a[0]);
int b[t];
copy(a, a + t, b);
assert( a[1] == b[1]);
assert(&a[1] != &b[1]);
}
{
int a[] = {2, 3, 4};
assert(a[1] == 3);
int b[] = {5, 6, 7};
assert(b[1] == 6);
// b = a; // error: invalid array assignment
const size_t t = sizeof(a) / sizeof(a[0]);
copy(a, a + t, b);
assert( a[1] == b[1]);
assert(&a[1] != &b[1]);
}
cout << "Done." << endl;
return 0;}
syntax highlighted by Code2HTML, v. 0.9.1