#include <iostream>
#include <iomanip>
using std::setw;
using std::cout;
int main() {
        int width = 2;
        int height = 2;
        int size = height * sizeof(int *) + width * height * sizeof(int);
		char *array = new char [33];
		int i = 0;
		for(char tmp = 'A'; tmp < 'A'+32; ++tmp) {
			array[i++] = tmp;
		}
		array[i] = 0;

        unsigned char *c = (unsigned char*)array;
        int **data = (int**)array;
		cout << std::hex << std::left ;
        for(i = 0; i < 16; ++i) {
                cout << "&c[" << setw(2) << i << "] = " << (void*)(c+i)
                	 << ", c[" << setw(2) << i << "] = 0x" << setw(12) << (unsigned)(c[i])
                	 << "&c[" << setw(2) << i+16 << "] = " << (void*)(c+i+16) 
                	 << ", c[" << setw(2) << i+16 << "] = 0x" << (unsigned)(c[i+16]) << '\n';
        }

        for(i = 0; i < height; i++) {
                data[i] = (int*)data + height + i * width;
				cout << "&data[" << i << "] = " << (int*)(&data[i])  << '\t';
				cout << "data[" << i << "] = " << data[i]  << '\t';
				cout << "data[" << i << "] should be " << (int*)((char*)(data + height) + i * width * sizeof(int)) << '\n';
        }

        int v = 1;
        for(i = 0; i < height; ++i) {
                for(int j = 0; j < width; ++j) {
                        cout << "&data[" << i << "][" << j << "] = " << (int*)&(data[i][j]) << '\t';
                        // data[i][j] = v++; <- BEWARE! this line will cause segmentation fault!
                        cout << "data[" << i << "][" << j << "] = " << data[i][j] << '\n';
                }
        }

        for(i = 0; i < 16; ++i) {
                cout << "&c[" << setw(2) << i << "] = " << (void*)(c+i)
                	 << ", c[" << setw(2) << i << "] = 0x" << setw(12) << (unsigned)(c[i])
                	 << "&c[" << setw(2) << i+16 << "] = " << (void*)(c+i+16) 
                	 << ", c[" << setw(2) << i+16 << "] = 0x" << (unsigned)(c[i+16]) << '\n';
        }

		delete [] array;
}
