1.对于下列代码中,p里面装的是什么?*p又是什么?&p又是什么?
int add=0x12345678;
int *p=(int*)add;
答:p里面装的是0x12345678的二进制数,并以地址的方式表现出来,代表地址0x12345678。*p是通过*去访问地址0x12345678这个地址处的数据。&p是取出整形指针变量p的地址,这里p的地址并不是0x12345678,而是它自己的地址。
2.关于“形参变量是属于被调函数的局部变量,实参变量是主调函数的局部变量”这句话中的被调函数和主调函数分别指的是什么?主调函数和主函数的区别?
答:主调函数指的是调用了已定义的其他函数的函数,而被调函数是指被其他函数调用的函数。主函数和主调函数的区别在于:主函数一定是主调函数,而主调函数不一定是主函数。例如:main函数调用了自定义函数a,函数a又调用了函数b,则a函数是main函数的被调函数,a函数又是b函数的主调函数。
3.关于全局变量的使用方法?
答:在函数中使用全局变量,一般要做全局变量说明,没有做说明的全局变量是无法使用的,全局变量的说明符为extern。但如果在一个函数之前定义的全局变量,在该函数内使用可不加说明。注:同一源文件中,全局变量与局部变量同名,则在局部变量的作用范围内,全局变量(外部变量)不起作用。
4.定义和声明的区别?
答:定义是指创建了一个对象(变量),为这个对象(变量)分配一块内存并取一个名字,则这个名字就和这个内存以及这个内存的地址一起绑定起来了。一个对象(变量)在一定的区域内(如函数内,全局内)只能被定义一次。
声明的两层含义:(1)通知编译器,这个名字已经与一块内存绑定了,及该变量已经在别处定义过了。声明可以多次出现。(2)通知编译器,这个名字已经被预定,其它地方不能再用它做变量名。
5.用static修饰局部变量和全局变量有什么效果?
答:(1)一般情况下,局部变量是存放在栈区,在该语句块执行结束时局部变量的生命周期便结束了。而加了static修饰后,该变量就存放在静态数据区,其生命周期会持续到整个程序执行结束为止。但局部变量的作用域并没有改变,仍是限于原来的语句块。(2)用static修饰全局变量主要是为了改变其作用域的范围,由使用了extern声明后作用于整个工程变为仅作用于本源文件。
6.如何辨别下列const修饰的变量?
(1)const int *p;(2)int * const p;(3)const struct devices dev【5】;(4)struct devices const * dev【5】;
答:第一步:将类型去掉;第二步:看const修饰谁,谁的值就不能修改。(1)去掉类型int,const修饰*p,即p所指向的空间里的值不变。(2)去掉类型int*,const修饰p,即指针变量p里的值不变,即p指向的地址不能变,但p指向的空间里的值可变。(3)去掉类型struct devices,const修饰dev【5】,dev【5】数组里的值不变。(4)去掉struct devices,const修饰*dev【5】,指针数组dev中的每个元素指向的空间里的值不变。
7.运算符的优先级问题?
答:同一优先级的运算符,运算次序由结合方向所决定。即:!>算术运算符>关系运算符>&&>||>赋值运算符。
8.条件运算符使用时有哪些注意事项?
答:(1)条件运算符的运算优先级低于关系运算符和算术运算符,但高于赋值运算符;(2)条件运算符“?”和“:”是一对运算符,不能分开单独使用;(3)条件运算符的结合方向是自右至左。
9.C语言中提供的6种位运算符分别是那些?
答:(1)按位与运算符“&”是双目运算符。其功能是参与运算的两个数字对应的二进制位相与。只有对应的两个二进制位均为1时,结果位才为1,否者为0。(2)按位或运算符“|”是双目运算符。其功能是参与运算的两个数字对应的二进制位相或。只要对应的两个二进制位有一个为1时,结果位就为1,否者为0。(3)按位异或运算符“^”是双目运算符,功能是参与运算的两个数字对应的二进制位相异或。当对应的两个二进制位相异时,结果位为1。(4)左移运算符“<<”是双目运算符,其功能是把“<<”左边的运算数的各二进制位全部左移若干位,由“<<”右边的数指定移动位数,高位丢弃,低位补0。右移运算符“>>”也是双目运算符,其功能是把“>>”左边的运算数的各二进制位全部右移若干位,由“>>”右边的数指定移动位数。但对于有符号数,在右移时,符号位将随同移动,当为正数时,最高位补0;而为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定。
10.使用位操作的优点是什么?
答:(1)使用位操作可以减少除法运算和取模运算,从而有效提高程序运行的效率。(2)在嵌入式编程中,它的一个最典型且使用广泛的是位间的与(&),或(|),非(~)操作。