关于getch和getchar用法

关于getch和getchar用法求助
在研究getch和getchar用法时候发现一个问题,为什么i循环结束后的值是53??
同时在getchar时候更奇怪~如图[img=http://img.bbs.****.net/upload/201404/16/1397656136_125944.jpg][/im
------解决方案--------------------
for( ; i <= 20; i++)
i == 20 时,数组ch[i] 下标越界,*(ch + i)指向了*(ch + i)(当i == 19)时的下一个地址,而这个地址是不确定的,因此*(ch + i) (i == 20时)所指向的内存单元的内容也就不确定了,方括号内的字符就是不确定的。
至于i为什么会等于53(或者再一次运行程序,这个值还会发生变化),这是因为*(ch + i)(i == 20时)所指向的地址,例如在我的电脑上编译运行时ch + i 是 0x0022ff09,它与ch(例如在我的电脑上:ch是 0x0022fed8)所指向的地址(即数组的地址)之差,即 *(ch + i)(请当成一个整体地址看待)- ch = 两个地址之间的距离,即*(ch + i)之中的i(此i非for循环当中的那个i(这个i是int变量))。例如;当ch = 0x0022fed8,而(ch + i) = 0x0022ff09时,0x0022ff09 - 0x0022fed8 = 0x31(等于10进制的49)。

ch = 0022fed8
0       0 = [1] 0022fed8
1       1 = [1] 0022fed9
2       2 = [1] 0022feda
3       3 = [1] 0022fedb
4       4 = [1] 0022fedc
5       5 = [1] 0022fedd
6       6 = [1] 0022fede
7       7 = [1] 0022fedf
8       8 = [1] 0022fee0
9       9 = [1] 0022fee1
10      10 = [1]        0022fee2
11      11 = [1]        0022fee3
12      12 = [1]        0022fee4
13      13 = [1]        0022fee5
14      14 = [1]        0022fee6
15      15 = [1]        0022fee7
16      16 = [1]        0022fee8
17      17 = [1]        0022fee9
18      18 = [1]        0022feea
19      19 = [1]        0022feeb
20      49 = [_]        0022ff09

Process returned 0 (0x0)   execution time : 7.763 s
Press any key to continue.