C语言下 int转char遇到的问题

本人在LINUX环境下做小实验:(关于自增IP地址的代码)
#include<stdio.h>
int main()
{
int i;
for(i=0;i<3;i++)
{
char ip[20] = "192.168.0.";
ip[10] = (char)i; //编译不通过
ip[11] = '\0';

printf("%s\n",ip);
}
}

但是注释处改成
/* ip[10] = '0'+i; */
就正确了。
哪为大侠解释下为什么?????

PS:不采纳复制来的垃圾答案,不知所云的那种。
我之前也用过直接赋值: /* ip[10]=i; */
但是结果是 / 192.168.0.(空) /
/ 192.168.0.(乱码)/
/ 192.168.0.(乱码)/
我的编译环境是 gcc 2.7-2 ,fc8(2.6.23),难道是编译器的版本问题???

再次强调下,我已经知道正确的做法了,但是不明白的是,为什么这个正确,请把原理,原因说下好吗????谢谢大侠们的关注,你们的热情让我很感动。

同意一楼的说法

例如
int a=90;
(char)a是等于Z,就是ASCII码为90所代表的字符而不是字符型的90

对不起后面的是我失误了,如果想这样赋值的话好像只能使用‘0’+i的方法,如果直接赋ip[10]=i
的话,仍然是把i代表数字的ASCII码赋给ip[10],跟ip[10]=(char)i的功能是一样的

而如果以%c打印i的话才是0,1,2,3
再次抱歉
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-04-25
一楼是对的.
我把我的答案撤了吧.

不是版本的问题,一楼的回答是正确的.
直接赋值:ip[10]=i;
i=0,为int型,对应ASCII码为0的字符,即空格.
另外两个输出也是这个道理.
第2个回答  2008-04-25
(char)i实际上是将i值当作ASCII码进行解释,很显然,ASCII码0~2所表示的“字符”均为不可显示的控制字符,并不是你需要的ASCII码为48~50的字符‘0’~‘2’。
第3个回答  2008-04-25
我在Linux和Windows下面编译均没有错误:
我不觉得不可见字符就可以提示编译错误,难不成强制类型转换都非法?

gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

vc 6.0+sp6 (Windows Vista Home)