"这篇资料是关于2011年长城信息产业股份有限公司针对应届生进行的C#.NET程序员笔试题。题目包含了C++相关的内存管理和指针操作,以及C#语言的基础知识,如变量赋值和函数调用。"
在C#中,虽然主要讨论的是C++的部分题目,但这些知识点对于理解C#也是非常重要的,因为C#和C++在语法和内存管理上有许多共通之处。
1. **内存管理与指针**:
- `sizeof`运算符用于计算数据类型的大小。在C++中,`sizeof(str)`返回字符串常量数组的长度,包括结束符`\0`,所以"Hello"的长度是6。而`sizeof(p)`返回指针的大小,通常在32位系统上是4个字节。`sizeof(n)`对于整型变量`int`,其大小也是4字节。
- 在函数内部,`sizeof(str)`返回的是函数参数的类型,而非实际传入的数组大小,因此它仍然为4,代表一个指针的大小。`malloc`分配的内存大小由参数决定,`sizeof(p)`在此处也表示指针的大小,不随分配内存的变化而变化。
2. **变量赋值与运算符优先级**:
- 代码段(1)展示了后缀递增和前缀递增的用法。`b++`先赋值后增加,`++b`则先增加后赋值。因此,`a=b++`后,`a`等于10,而`b`变为11。接着,`c=++b`使`b`先增加到12,然后赋值给`c`,所以`c`是12。最后,`d=10*b++`中`b++`在乘法之后发生,所以`d`是120,而`b`变成了13。输出结果是`10,13,12,120`。
3. **引用与参数传递**:
- 代码段(2)展示了引用参数的特性。`fun`函数中的`a`和`b`是`main`函数中`a`和`b`的引用,因此它们的修改会直接影响到原始变量。第一次调用`fun`后,`a`和`b`分别为5和5。第二次调用时,由于`c`和`d`的值被传递给`fun`,`c`相当于`a`,`d`相当于`b`,所以`fun(d,c)`会改变`c`和`d`的值,输出`c,d:5,21`。
4. **静态变量**:
- 代码段(3)中的`fun`函数包含一个静态变量`a`。静态变量在函数调用之间保留其值。因此,第一次调用`fun(5)`返回`15`(即`3*2+5`),第二次调用`fun(6)`返回`24`(即`3*3+6`)。
5. **内存分配错误**:
- 最后的错误分析部分提到了一个常见错误。在`GetMemory`函数中,分配了内存,但在`Test`函数中没有正确传递这个内存。`str`在`GetMemory`中被分配了内存,但在`Test`中尝试复制字符串到未初始化的指针,导致程序崩溃。正确的做法是在`GetMemory`中返回内存地址,并在`Test`中接收这个地址。
以上就是C++中涉及的一些关键知识点,这些对于理解和编写C#程序也很有帮助,尽管C#在内存管理和垃圾回收方面有所不同。例如,C#中没有`malloc`,而是使用`new`关键字进行对象实例化,且由垃圾回收器自动管理内存。同时,C#的引用参数(`ref`和`out`)与C++的引用有所不同,C#的引用参数保证了总是引用同一个对象。