1:以下代码最后一次打印结果是()
void fun(int iinputnum)
{
static int icount=1;
icount=icount+iinputnum;
printf( “ \n icount =%d ” ,icount+iinputnum);
}
最后输出 iCount = 6
解析:
静态局部变量的特点:1. 该变量在全局数据区分配内存;2. 静态局部变量在程序执行到该对象的声明处时被首次初始化,即以后的 函数调用 不再进行初始化;3. 静态局部变量一般在声明处初始化,如果没有显式初始化,会被程序自动初始化为0。
调用fun(1),icount = 2 输出icount = 3
调用fun(2),icount = 2+2 = 4,输出icount = 4+2 = 6
2:二维数组X按行顺序存储,其中每个元素占1个存储单元。若X[4][4]的存储地址为Oxf8b82140,X[9][9]的存储地址为Oxf8b8221c,则X[7][7]的存储地址为()。
解析:设每行元素个数为n
[9][9] - [4][4] = n-4+9+4n = 5n+5 -> n =43
[7][7] - [4][4] = n-4+2n+7 = 3n+3 = 132
则地址为 Oxf8b82140 0x84 = 为Oxf8b821c4
3:
int main(int argc, char **argv)
{
int a[4] = {
1, 2, 3, 4};
int *ptr = (int *)(&a + 1);
printf("%d", *(ptr - 1));
}
解析:
&a是数组指针,其类型为int()[4],&a数组指针,a是数组首地址,则(a+1)代表从a数组首地址跳跃一个int的长度,(&a+1)表示从数组首地址跳跃一个数组的长度,而(a+1)只是跳跃1个int的长度,所以(&a+1)表示a[4],ptr为int类型,则*(ptr-1)= a[3] = 4
4:以下代码有什么问题?
struct Test
{
Test( int ) {}
Test() {}
void fun() {}
};
void main( void )
{
Test a(1);
a.fun();
Test b();
b.fun();
}
解析:Test b()是错误的,并不会调用无参构造函数,因为要调用无参构造函数,必须申明为Test b
5:
int main()
{
int i;
for(i=0;i<3;i++)
switch(i)
{
case 0:printf("%d",i);
case 2:printf("%d",i);
default:printf("%d",i);
}
}
程序运行后输出结果是()。
解析:switch语句中没有加break会执行满足条件的和之后的所有条件,i=0 所以输出0,0,0,i=1 输出1,i=2输出2,2所以最后的输出序列为000122
6:
下面有关volatile说法正确的有?
A:当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中;以后再取变量值时,就直接从寄存器中取值(对)
B:优化器在用到volatile变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份 (对)
C: volatile适用于多线程应用中被几个任务共享的变量
D:一个参数不可以既是const又是volatile(错)
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
对于一般变量:为提高存取速度,编译器优化时有时会先把变量读取到一个寄存器中。以后再取变量值时,就直接从寄存器中取值。
一个参数既可以是const也可以是volatile:一个例子是只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它。(简单点就是该程序代码不能试图去修改它,但不排除硬件方面修改了它,我们每次都得重新读取它的值。)
几个应用例子:
a. 并行设备的硬件寄存器(如:状态寄存器)。
b. 一个中断服务子程序中会访问到的非自动变量。(个人理解:中断服务子程序不能用缓存在寄存器中的值来判断事件,因为那个值可能被修改了,需要重新读取。所以一般需要把这种变量声明为volatile。)
c. 多线程应用中被几个任务共享的变量。
7:
char* getmemory(void)
{
char p[]=”hello world”;
return p;
}
void test(void)
{
char *str=NULL;
str=getmemory(); printf(str);
}
请问运行Test 函数会有什么样的结果? (输出乱码)
解析:解析:返回“字符串常量的指针”和“返回数组名”的区别在于,一个返回静态数据区的地址,一个返回栈内存(动态数据区)的地址。
8:下面程序段的输出结果是
char *p1 = ”123”, *p2 = ”ABC”, str[