Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9193
  • 博文数量: 9
  • 博客积分: 190
  • 博客等级: 入伍新兵
  • 技术积分: 115
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-22 15:02
文章分类

全部博文(9)

文章存档

2014年(1)

2011年(4)

2010年(4)

我的朋友
最近访客

分类: C/C++

2011-04-18 18:49:44

1.对于指针变量,一个非常中的操作就是要判断其有效性,即是否为空指针。
如利用动态内存申请运算符申请内存后,需要首先对内存是否申请成功进行判断。
2. static 再C语言中声明函数时,该static 函数只具有文件作用域。及该函数的作用域被限制再声明它的模块内。
3.变量类型的自动转换:
当一个操作符对两个不同类型的变量进行操作时,低类型变量会自动转换为高类型变量。当两个变量仅存在有无符号的差别时,有符号变量自动转换为无符号变量。
  1. void foo(void)
  2. { unsigned int a = 6;
  3. int b = -20;
  4. (a+b > 6)?puts("> 6") : puts("<= 6");
  5. }
以上代码的执行结果为>6,因为有符号数-20自动转换为了一个非常大的无符号数。
4.宏定义尽量少使用,因为你不知道会在什么地方犯错。
  1. #define DPS int *
  2. typedef int * GPS;

  3. DPS T1,T2;
  4. GPS T3,T4;
在上面的这段代码中,DPS T1,T2;本意为定义两个整形指针,可是由于红定义的局限性(暂且这么说吧),实际上是定义了一个整形指针和一个整形变量。
而typedef 则不具有这个问题。
5. 下面的这段代码测试的是什么问题呢,惯性思维还是懒得思考?
  1. #include <stdio.h>
  2. #include <string.h>

  3. int main(int argc,char *argv[])
  4. {
  5.         char *p1="name",*p2;
  6.         p2=(char *)malloc(20);
  7.         memset(p2,0,20);
  8.         while(*p2++=*p1++);
  9.         printf("%s\n",p2);
  10.         return 0;
  11. }
输出结果为nothing 。
6.关于空指针
C语言中,每种 指针类型都对应这一个空指针,不同类型的指针对应的空指针的内部表达可能是不想同的。(空指针的内部值不一定是0,不同类型的CPU 对应着不同的空指针内部值,同一个类型的CPU不同的指针类型对应空指针内部值也可能不想同,别忘了C语言广泛应用于嵌入式系统)。
C语言中,我们使用0和NULL表示空指针。实际上再编译时编译器将NULL替换为0,再将0转换为该类型CPU对应的空指针内部值。
7.函数指针
  1. void fun(void);
  2. void (*fp)()=fun;

  3. cout<<*fp<<fp<<endl;
上述代码执行后,我们可以发现*fp与fp的值是相等的,这与其他类型的指针变量是不同的。(函数编译后是什么样的指令形式?)
这也导致了利用函数指针调用函数时具有一下两种不同的形式:
  1. (*fp)();
  2. fp();
两者的结果是一样的。虽然前者看起来更符合指针的定义,但是ANSI C也接受后者这种形式。
8.函数fun的声明可以位于另一个函数的体内。但是不可以在其体内进行定义。
并且函数fun 可以在其声明的函数体以外的地方调用。
阅读(249) | 评论(0) | 转发(0) |
0

上一篇:Cpp 运算符优先级

下一篇:将博客搬至CSDN

给主人留下些什么吧!~~