以下是引用施熠在2012-3-25 22:22:59的发言:
哦哦,我知道了。。但是,怎么替换???
现在模仿编译器的操作:
首先它找到函数原型,就是如下这个
void printchars(char,int);
根据这样的声明,它知道每当要调用函数时,将依据什么来检查。
然后下面是你的调用代码:
printchars(" ",20+i);
printchars("*",2*(21-i)-i);
对每一个参数,都要比较,把" "和"*"代入到(char,int)中的char位置,很明显,函数定义指定要求char,但你传入的是字符串char*(双引号是字符串,单引号是字符),不符合要求,因此编译器拒绝这样的调用,指出错误,停止编译。这样开头错误,导致后面的一系列代码都跟着受影响,因此,后面的错误信息你基本上不用看了,先解决这个,因为后面的错误或警告信息,很可能是这个引起的。解决这个之后,后面如果还有错误或警告,就依次从前面开始解决,直到没有任何错误和警告为止。
这就类似于数学中的代入法,“代数”是代表某些实际数值,诸如F=ma这样的,表示F和ma是等价的,在出现F的地方,可以把F替换为ma。编程也一样。比如在你这个程序中,如果使用printf("%s", printchars('*', 20+i))这样的调用代码,也是如此替换,你会看到printchars()函数返回的是void,与printf()要求的char*不符,因此也是错的,如果希望要写出那样的调用代码,就必须把printchars()函数的定义写成返回char*而不是void。