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文件,即目标文件。每个目标文件都是独立编址的,也即说每个目标文件的第一条指令都从相同的地址开始存放。链接器将多个目标文件或库文件按照各文件中的段进行统一编址,生成一个完整的统一的地址映像。
9、Make文件:Make实际上是一个批处理程序,该程序通过解释特定格式的Make脚本(Make文件),完成一个项目相关文件的编译、汇编与链接。
Make脚本一般描述了整个项目中各个文件的相互依赖关系,Make通过调用脚本中指定编译器、汇编器和链接器,按照项目各文件的依赖关系进行处理。
常见的Make程序有:MS nmake、Gcc make、
10、最高效的循环设计是count down to 0的do-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个临时变量清零,但是这段代码有两个假设:编译器将i、j、k三个变量通过堆栈表示,压栈顺序是i、j、k,如果k在寄存器怎么办?对k取地址操作将产生Data Aboart。
14、关于临时变量需要注意的问题:(1) 不要对临时变量作取地址操作,因为不知道编译器是否将这个变量映射到了寄存器;(2) 不要返回临时变量的地址,或临时指针变量,因为堆栈中的内容是不确定的(出了这个函数,存放在堆栈中的局部变量就没有意义了);(3) 不要申请大的临时变量数组,由于临时变量是在堆栈中实现的,能有多大的堆栈呢?
15、sizeof的三种形式:
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); //结果4,ss是指向字符串常量的字符指针
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); //结果10,strlen是到‘\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”开头。
在某一模块中使用的变量,变量名的开始需有模块名。
函数名的命名应像全局变量一样采用首字母大写方式,函数名的开始应以“模块名_”的格式注明函数所属模块。
19、const常量无法在数组定义时作为数组长度。
20、枚举不能定义除整型外的其他类型常量。
文章评论(0条评论)
登录后参与讨论