// ---------------
// 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