1、数组名作为参数传递给函数,作为该参数的数组名被处理为(该数组的首地址)。
分析:
数组名就是数组的首地址。
用数组名做函数参数时所进行的传递实际上是地址的传递,也就是把实参数组的首地址赋予形参数组名。
形参数组名取得该首地址后,也就等于有了具体的地址。实际上是形参数组和实参数组为同一数组,共同使用一段内存空间。
2、假设有一个C++类名为Thunder,则此类的析构函数为(~Thunder())。
分析:
C++当中的析构函数格式如下:
class <类名> { public: ~<类名>(); };
3、 while (!x)
中!x
表示“非”,是一种逻辑运算。若x的真值为1,则!x为0;若x的真值为0,则!x为1。
4、由C++源程序文件编译而成的目标文件的缺省扩展名为(obj
)。
分析:
生成目标文件的缺省扩展名为:.obj
生成可执行文件的缺省扩展名为:.exe
编译:当前源代码编译成二进制目标文件(.obj
文件)
链接(link):将生成的.obj
文件与库文件.lib
等文件链接,生成可执行文件(.exe
文件)。
一个现代编译器的主要工作流程如下:源程序(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→ 目标程序(object code)→ 连接器(链接器,Linker)→ 可执行程序(executables)
5、下面程序执行的结果为( I 8 )
void main( ) { char ch1,ch2; ch1 ='D'+'8'-'3'; ch2 ='9'-'1'; printf("%c %d\n",ch1,ch2); }
6、一张1024×640分辨率的图片,假定每个像素用16位色彩表示,用位图文件(bitmap)格式存储,则这张图片文件需要占用多大的存储空间1280KB。
分析:1KB=1024B
(Byte,字节),而1字节=8位1024*640*16/1024/8=1280KB
。
7、【没看懂】下面是一段c程序:
void foo(int b[][3]) { ++b; b[1][1]=9; } void main() { int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; foo(a); printf(“%d”,a[2][1]); }
这段程序的输出是(9)
分析:
1、C/C++传递的数组会退化成指针
2、对于数组指针的++,会根据数组中存储的内容,调整指针。
因为b是二维数组,b的类型是int(*)[3]
,即指向一个容量为3的一维int数组;所以++b相当于移动了数组的一整行。此时b指向了b[1][0]
处,然后我们代码的b[1][1] = 9
可以看成指针的偏移。实际上可以化为*(*(b+1)+1)= 9
,因为b不是指向b[0][0]
处,而是指向b[1][0]
处,所以通过*(*(b+1)+1)= 9
实际上修改的是b[2][1]
处的内容。修改成了9. 所以最后打印a数组同样的位置时,打印的是9
8、
char* getmemory(void) { char p[]=”hello world”; return p; } void test(void) { char *str=NULL; str=getmemory(); printf(str); }
请问运行Test 函数会有什么样的结果? 输出乱码
分析:getmemory
返回的指针,是内部变量,调用之后会被回收。 所以输出是不确定的。如果定义成char* p =”hello world”;
返回常量区地址是可以得到正常打印的。
9、C++中32位单精度浮点数能表示的十进制有效数字是多少位?(7)
分析:
单精度浮点数的有效位数是7位。
双精度浮点数的有效位数是16位。