原创 C语言进阶阅读笔记续

2010-4-7 19:28 2797 10 10 分类: 软件与OS

7、字符指针变量与字符数组的区别<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


       (1) 字符数组由若干元素组成,每个元素存放一个字符;而字符指针变量只存放字符串的首地址,不是整个字符串。


       (2) 对数组初始化要用static,对指针变量不用。


(3) 对字符数组赋值,只能对各个元素赋值,不能像下面这样:


char str[14];


str=”I love c!”;


对指针变量可以:


char *str;


str=”I love c!”;


注意:此时赋给str的不是字符,而是字符串首地址。


(4) 数组在定义和编译时分配内存单元,而指针变量定义后最好将其初始化,否则指针变量的值会指向一个不确定的内存段,将会破坏程序。


(5) 指针变量的值是可以改变的,而字符数组名所代表的字符串首地址却是不能改变的。


8、编译器将C文件转换成汇编文件,汇编器将汇编文件转换成*.o文件,即目标文件。每个目标文件都是独立编址的,也即说每个目标文件的第一条指令都从相同的地址开始存放。链接器将多个目标文件或库文件按照各文件中的段进行统一编址,生成一个完整的统一的地址映像。


9Make文件:Make实际上是一个批处理程序,该程序通过解释特定格式的Make脚本(Make文件),完成一个项目相关文件的编译、汇编与链接。


       Make脚本一般描述了整个项目中各个文件的相互依赖关系,Make通过调用脚本中指定编译器、汇编器和链接器,按照项目各文件的依赖关系进行处理。


       常见的Make程序有:MS nmakeGcc make


10、最高效的循环设计是count down to 0do-while循环。


11、函数指针:函数指针即指向函数地址的指针。利用该指针可以知道函数在内存中的位置,可以利用函数指针调用函数。int *func(void)int (*func)(void)的区别


       int *func(void) //这是返回一个整型指针的函数


       int (*func)(void); //这是一个函数指针


注意事项:不能将普通变量的地址赋给函数指针,不能将函数的调用赋给函数指针,可以将函数名赋给一个函数指针。


12、指出下面这段程序存在的问题:


char *DoSomething(…)


{


       char i[32*1024];


       memset(i,0,32*1024);


      


       return i;


}


两个重大问题:(1) 临时变量是通过堆栈实现的,太大的临时变量数组会冲掉堆栈;(2) 返回堆栈中的地址是非常危险的,因为堆栈中的值永远是不确定的。


13、指出下面这段程序存在的问题:


void DoSomething(…)


{


       int i


       int j


       int k


       memset(&k,0,3*sizeof(int));


}


这段代码的作用是将3个临时变量清零,但是这段代码有两个假设:编译器将ijk三个变量通过堆栈表示,压栈顺序是ijk,如果k在寄存器怎么办?对k取地址操作将产生Data Aboart


14、关于临时变量需要注意的问题:(1) 不要对临时变量作取地址操作,因为不知道编译器是否将这个变量映射到了寄存器;(2) 不要返回临时变量的地址,或临时指针变量,因为堆栈中的内容是不确定的(出了这个函数,存放在堆栈中的局部变量就没有意义了)(3) 不要申请大的临时变量数组,由于临时变量是在堆栈中实现的,能有多大的堆栈呢?


15sizeof的三种形式:


       sizeof(var);         //sizeof(变量);


       sizeof(type_name);   //sizeof(变量);


sizeof  var;        //sizeof 变量;


16、关于sizeof的几道题目:


       (1) char *ss=”<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0123456789”;


sizeof(ss);    //结果4ss是指向字符串常量的字符指针


sizeof(*ss);   //结果1*ss是第一个字符


(2) char ss[]=”0123456789”;


sizeof(ss);    //结果11,计算到‘\0位置,因此是10+1


sizeof(*ss);   //结果1*ss是第一个字符


(3) char ss[100]=”0123456789”;


sizeof(ss);    //结果100


strlen(ss);    //结果10strlen是到‘\0为止之前的长度


(4) int ss[100]=”0123456789”;


sizeof(ss);    //结果200


strlen(ss);    //错误,strlen的参数只能是char且必须以’\0’结尾


17、用C编写中断服务程序应该注意的:(1) 不能有返回值;(2) 不能向ISR传递参数;(3) ISR应尽可能地短小精悍;(4) printf函数会带来重入和性能问题,不能在ISR中采用;(5) 所有不可重入性函数都不应该在中断中使用;(6) 浮点运算以及其它的耗时操作都不应该在ISR中使用。


18、局部变量以小写字母命名;全局变量以首字母大写方式命名;定义类型和宏定义常数以大写字母命名。


对于指针的定义,名称大小写根据指针为全局/局部变量来定,但指针名必须以小写的“p”开头。


在某一模块中使用的变量,变量名的开始需有模块名。


函数名的命名应像全局变量一样采用首字母大写方式,函数名的开始应以“模块名_”的格式注明函数所属模块。


19const常量无法在数组定义时作为数组长度。


20、枚举不能定义除整型外的其他类型常量。

文章评论0条评论)

登录后参与讨论
我要评论
0
10
关闭 站长推荐上一条 /2 下一条