C编程学习记录

时间: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 *= "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*),因此它们是不相容的。





posted on 2010-09-25 14:18 编码者-thinker 阅读(129) 评论(0)  编辑 收藏 引用 所属分类: 语言编程学习


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜