时间:2010-09-25
类型问题:
1.自动类型转换问题
1int array[] = {1,2,3,5,6,4};
2#define total_size ( sizeof(array)/sizeof(array[0]) )
3
4int main()
5{
6 int i;
7 /**//*看似没有问题的循环,可是输出为空,原因何在??*/
8 for(i = -1;i < total_size -1; ++i )
9 {
10 printf("array[%d]=%d\n", i + 1, array[ i + 1 ] );
11 }
12 /**//*
13 sizeof()返回值为无符号整数,而i为有符号数,
14 在表达式"i<total_size - 1 "中结果为false,
15 因为 i(=-1)被自动转换为无符号数,而使得i变成很大的正整数使得判断结果为false
16 */
17 return 0;
18}
2.参数类型匹配问题
如果编译下面的一段代码,编译器会给出一条警告信息:
warning #2167-D: argument of type "char **" is incompatible
1void foo( const char **p){}
2void foo1(const char* a){
3 printf("%s\n",a);
4}
5
6int main(int argc,char** argv)
7{
8 foo(argv);
9 char *p = "hello";
10 foo1(p);
11 return 0;
12}
实参char*p与形参const char* a是相容的,这是没有问题的。
但有人认为实参char **argv 与形参 const char **p也应该是相容的。答案肯定是错的。
我们来分析一下为什么会错误呢?
在ANSI C标准中,有如下一句话:
每个实参都应该有自己的类型,这样它的值就可以赋值给与它对应的形参类型的对象了(该对象的类型不包括限定符)。
就是说参数传递过程类似于赋值。
赋值的约束条件,要使赋值的形式合法,必须满足下列条件之一:
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
正是这个条件,使得实参char *能够与形参const char*匹配。
char *cp;
const char *ccp;
ccp = cp;//是合法的。
//const char** 指向有const 限定符的char类型指针的指针;
char ** 和const char** 虽然都是没有限定符的指针类型,但它们所指向的类型不一样(前者指向char *,后者指向const char*),因此它们是不相容的。