forked from cs107e/cs107e.github.io
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpointers.c
executable file
·81 lines (69 loc) · 2.43 KB
/
pointers.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
#include "gpio.h"
#include "uart.h"
#include "printf.h"
void main(void)
{
gpio_init();
uart_init();
// Basic pointer review: What's the difference between incrementing a `char
// *` and a `unsigned int *`?
printf("\nPointer review:\n");
printf("===============\n");
char *char_ptr = "Hello";
unsigned int uint_arr[] = {0, 1, 2};
unsigned int *uint_ptr = uint_arr;
printf("char_ptr = %p\n", char_ptr);
printf("char_ptr+1 = %p\n", char_ptr + 1);
printf("uint_ptr = %p\n", uint_ptr);
printf("uint_ptr+1 = %p\n", uint_ptr + 1);
// What happens if we walk off the end of the array?
printf("\nWalking off the end of the array uint_arr: \n");
for (int i = 0; i < 4; ++i) {
printf("[%d] = %x ", i, uint_ptr[i]);
}
printf("\n");
printf("\nSingle-dimensional arrays and pointers\n");
printf("======================================\n");
int f[] = { 0, 1 };
int g[] = { 2, 3, 4 };
// will the following declaration work?
//int *h = {2, 3, 4};
printf("f = %p\n", f);
printf("g = %p\n", g);
int *p[2] = { f, g };
int *q = p[0];
printf("p = %p\n", p);
printf("q = %p\n", q);
printf("p[0] = %p\n", p[0]);
printf("p[1] = %p\n", p[1]);
printf("\nPointers to pointers example\n");
printf("==============================\n");
const char *tokens[2] = { "Hello", "World" };
printf("tokens = %p \n", tokens);
printf("tokens+1 = %p \n", tokens + 1);
printf("tokens[0] = %p ('%s')\n", tokens[0], tokens[0]);
printf("tokens[1] = %p ('%s')\n", tokens[1], tokens[1]);
printf("*tokens[0] = %c\n", *tokens[0]);
printf("*tokens[1] = %c\n", *tokens[1]);
printf("**tokens = %c\n", **tokens);
printf("**(tokens + 1) = %c\n", **(tokens + 1));
printf("\nMulti-dimensional arrays and pointers\n");
printf("=====================================\n");
int a[2][2] = { {0, 1}, {2, 3} };
int *b = &a[0][0];
int (*c)[2] = a;
int (*d)[2][2] = &a;
printf("a = %p\n", a );
printf("&a[0][0] = %p\n", &a[0][0] );
printf("&a[0][1] = %p\n", &a[0][1]);
printf("b = %p\n", b );
printf("b+1 = %p\n", b+1);
printf("b+2 = %p\n", b+2);
printf("&a[0] = %p\n", &a[0]);
printf("&a[1] = %p\n", &a[1]);
printf("c = %p\n", c );
printf("c+1 = %p\n", c+1);
printf("d = %p\n", d );
printf("d+1 = %p\n", d+1);
printf("\04"); // Send end of transmission to rpi-install.py
}