Chinaunix首页 | 论坛 | 博客
  • 博客访问: 984721
  • 博文数量: 327
  • 博客积分: 9995
  • 博客等级: 中将
  • 技术积分: 4319
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-25 11:21
文章存档

2011年(31)

2010年(139)

2009年(157)

我的朋友

分类: C/C++

2009-06-17 20:47:04

1、早用lint,勤用lint,不要等到最后才用lint。lint是软件的道德标准
2、关于typedef
先看一个声明:void (*signal(int sig, void (*func)(int))) (int);
对于它,可以简化为:
typedef void (*ptr_to_func) (int)
ptr_to_func signal(int, ptr_to_func)
对于像以上那个复杂的typedef声明,你大可不必深入的去记忆、研究,只需要把它替代,化简为一个声明,那意义就豁然开朗了。
注意:
①不要在一个typedef中放入几个声明器;
②千万不要把typedef嵌到声明中间部分。
typedef与define的区别:
①可以用其他类型说明符对宏类型名进行扩展,但对typedef所定义的类型名却不能这样做。
②在连续声明中,用typedef定义的类型能够保证声明中所有的变量均为同一种类型,而用#define定义的类型则无法保证。
 
3、数组与指针并不相同,某些情况下,他俩是一样的,不过也存在情况,他俩不一样例如:
文件1: int mango[100];
文件2: extern int * mango;
这是不同的,相当于把整数和浮点数混为一谈。
 
4、Turning实验,人工智能,人机对话,都是十分有意思的东西。
 
5、堆区域用于动态分配的存储,也就是通过malloc(内存分配)函数获得的内存,并通过指针访问。堆中所有东西都是匿名的————不能按名字直接访问,只能通过指针间接访问。
被分配的内存总是经过对齐,以适合及其最大尺寸的原子访问。
堆的末端由一个称为break的指针来标识。当堆器需要更多内存时,它可以通过系统调用brk和sbrk来移动指针。一般情况下,不必自己显示调用brk,如果分配的内存容量很大,brk最终会被自动调用。
 
6、尽量不要在你的代码中使用无符号类型,以免增加不比要的复杂性。尤其是不要仅仅因为无符号书不存在负值(如年龄、国债)而用它来表示数量。尽量使用int那样的有符号类型,这样在涉及升级混合类型的复杂细节时,不必担心边界情况(如-1被翻译为非常大的正数)。只有在使用位段和二进制掩码时,才可以用无符号数,应该在表达式中使用强制类型转换,使操作数均为有符号或者无符号数。
 
7、这也是为什么C++ 语言令人失望的原因:它对C语言中存在的一些最基本的问题没有什么改进,而它对C语言最重要的扩展(类)却是建立在脆弱的C类型模型上。
 
8、看一段代码:
int main(void)
{
    int pa=0;
    char * avarsc[] =
    {
        "color monitor",
        "big disk",
        "Cray"
        "on-line drawing routhines",
        "mouse",
        "keyboard",
        "power cables",
    };
    char ** pp;
    pp = avarsc;
 
    printf("%s\n", avarsc[2]); // output Crayon-line drawing routhines
    printf("%s\n", *(pp++)); // output big disk
    scanf("%d", pa);
    return 1;
}
注意字符串数组的定义,最后那个逗号,还有"Cray"后头没有逗号其实avarsc是个字符指针的指针
曾经写过一个这样错误的代码,要为一个字符串: "" 空间,应该是STRLEN("\"\"")却写成了STRLEN(""""),编译没有错误,也就没有注意,在后来走查代码的时候,发现了错误的地方,多亏为它多申请了不少空间,不然这又是个难以察觉的内存错误。
 
9、全局变量由C编译程序在动态区之外的固定存储区域中存储。当程序中多个函数都使用同一数据时,全局变量将是很有效的。然而,由于三种原因,应避免使用不必要的全局变量:
①不论是否需要,它们在整个程序执行期间均占有存储空间。
②由于全局变量必须依靠外部定义,所以在使用局部变量就可以达到其功能时使用了全局变量,将降低函数的通用性,这是因为它要依赖其本身之外的东西。
③大量使用全局变量时,不可知的和不需要的副作用将可能导致程序错误。如在编制大型程序时有一个重要的问题:变量值都有可能在程序其它地点偶然改变。
 
10、在编译时分配存储空间的变量称为静态存储变量,定义的静态存储变量无论是做全程量或是局部变量,其定义和初始化在程序编译时进行。作为局部变量,调用函数结束时,静态存储变量不消失并且保留原值。
补充:对于静态全局变量,主要是为了保证唯一性。
补充:关于static的三点正确见解
A、若全局变量仅在单个C文件中访问,则可以将这个变量修改为静态全局变量,以降低模块间的耦合度;
B、若全局变量仅由单个函数访问,则可以将这个变量改为该函数的静态局部变量,以降低模块间的耦合度;
C、设计和使用访问动态全局变量、静态全局变量、静态局部变量的函数时,需要考虑重入问题;
阅读(1478) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

microtiger2009-10-28 11:39:52

总结的不错,有空交流下,microtiger@gmail.com

chinaunix网友2009-10-25 11:31:31

没错。pp++指向了字符串"big disk"

chinaunix网友2009-10-22 12:48:13

printf("%s\n", *(pp++)); // output big disk 这个有问题吧~