1void test1() {
2    int a = 3;
3    int* pb = &a;
4    int c = *pb;
5    printf("Reading from a pointer: %d %d\n", a, c);
6    *pb = 4;
7    printf("Writing to a pointer: %d\n", a);
8    printf("Testing casts: %d %g %g %d\n", 3, (float) 3, 4.5, (int) 4.5);
9}
10
11void test2() {
12    int x = 4;
13    int px = &x;
14    // int z = * px; // An error, expected a pointer type
15    int y = * (int*) px;
16    printf("Testing reading (int*): %d\n", y);
17}
18
19void test3() {
20    int px = (int) malloc(120);
21    * (int*) px = 8;
22    * (int*) (px + 4) = 9;
23    printf("Testing writing (int*): %d %d\n", * (int*) px, * (int*) (px + 4));
24    free((void*) px);
25}
26
27void test4() {
28    int x = 0x12345678;
29    int px = &x;
30    int a = * (char*) px;
31    int b = * (char*) (px + 1);
32    int c = * (char*) (px + 2);
33    int d = * (char*) (px + 3);
34    printf("Testing reading (char*): 0x%02x 0x%02x 0x%02x 0x%02x\n", a, b, c, d);
35}
36
37void test5() {
38    int x = 0xFFFFFFFF;
39    int px = &x;
40    * (char*) px = 0x21;
41    * (char*) (px + 1) = 0x43;
42    * (char*) (px + 2) = 0x65;
43    * (char*) (px + 3) = 0x87;
44    printf("Testing writing (char*): 0x%08x\n", x);
45}
46
47int f(int b) {
48    printf("f(%d)\n", b);
49    return 7 * b;
50}
51
52void test6() {
53    int fp = &f;
54    int x = (*(int(*)()) fp)(10);
55    printf("Function pointer result: %d\n", x);
56}
57
58void test7() {
59    int px = (int) malloc(120);
60    * (float*) px = 8.8f;
61    * (float*) (px + 4) = 9.9f;
62    printf("Testing read/write (float*): %g %g\n", * (float*) px, * (float*) (px + 4));
63    free((void*) px);
64}
65
66void test8() {
67    int px = (int) malloc(120);
68    * (double*) px = 8.8;
69    * (double*) (px + 8) = 9.9;
70    printf("Testing read/write (double*): %g %g\n", * (double*) px, * (double*) (px + 8));
71    free((void*) px);
72}
73
74
75int main() {
76    test1();
77    test2();
78    test3();
79    test4();
80    test5();
81    test6();
82    test7();
83    test8();
84    return 0;
85}
86