### 华为软件工程师笔试题知识点解析
#### 一、判断题知识点解析
1. **数组元素初始化**
题目考察的是数组的初始化方式。数组`int a[2][2]={{1},{2,3}};`中,第一行只提供了`1`作为初始值,因此剩下的元素会自动补零。故`a[0][1]`的值为`0`。
2. **指针类型的理解**
这里考察的是指针类型的理解。`int (*ptr)()`表示`ptr`是一个指向函数的指针,该函数没有参数且返回`int`类型,并非一维数组名。
3. **指针比较运算符**
指针之间可以进行比较运算,但条件是它们必须指向同一个数组或者是在这个数组的边界之内。如果两个指针指向不同类型的对象或者不同的数组,则不能进行比较。
4. **switch 语句中的数据类型**
`switch` 语句的表达式可以是`int`, `char`, `enum` 类型或能隐式转换为这些类型的表达式。`float` 和 `unsigned int` 不可以直接用于 `switch` 表达式,因为 `float` 可能存在精度问题,而 `unsigned int` 需要转换为 `int` 才能被接受。
5. **宏定义**
宏定义`#define print(x) printf("the no, "#x " ,is ")`展示了如何使用宏定义来创建一个简单的打印函数。这里使用了字符串连接操作符`#`将变量名转换为其字符串形式。
#### 二、填空题知识点解析
1. **sizeof 运算符**
- `sizeof(str)`:计算数组`str`的字节数,包括终止符`\0`,结果为6。
- `sizeof(p)`:计算指针`p`的字节数,在32位系统中为4,在64位系统中为8。
- `sizeof(n)`:计算整型变量`n`的字节数,通常为4。
- `sizeof(str)`(在函数声明中):计算传入的数组的字节数,但在函数体内,`str`被视为指针,因此结果为4(32位系统)或8(64位系统)。
2. **动态内存分配与释放**
- `void setmemory(char** p, int num)`:此函数接收一个指向`char`指针的指针以及一个整数`num`,通过`malloc`为`p`分配内存。
- 在`test`函数中调用`setmemory`后,`str`指向了新分配的内存,然后通过`strcpy`复制了字符串`"hello"`到`str`所指向的内存中。最后`printf`打印出`"hello"`。
- 注意:未释放`str`所指向的内存,存在内存泄漏。
3. **指针运算与数组访问**
- `int arr[] = {6,7,8,9,10};`:定义了一个整型数组。
- `int *ptr = arr;`:`ptr`指向数组的第一个元素。
- `(ptr++) += 123;`:首先`ptr`指向`arr[0]`即`6`,加上`123`变为`129`,然后`ptr`自增指向`arr[1]`即`7`。
- `printf("%d,%d", *ptr, *(++ptr));`:此时`ptr`指向`arr[1]`即`7`,输出为`129`(`arr[0]`的值)和`10`(`arr[2]`的值)。
#### 三、编程题知识点解析
1. **字符串比较函数**
编写一个不使用库函数的字符串比较函数`int strcmp(char* source, char* dest)`,需要逐个字符比较直到遇到`\0`为止,相同返回0,不同返回-1。
2. **回文字符串判断**
实现一个函数`int fun(char *p)`用于判断一个字符串是否为回文,即正着读和反着读都一样。可以通过两个指针分别从字符串的首尾开始向中间移动并比较对应位置的字符来实现。
#### 四、其他知识点解析
1. **预编译**
预编译是指在编译前对源代码进行预处理的过程,可以提高编译速度。通常用于大型代码体的编译优化。
2. **常量指针与指向常量的指针的区别**
- `char* const p;`:常量指针,指向的地址不可改变。
- `char const *p;`:指向常量的指针,指针可以改变,但指向的值不可改变。
- `const char *p;`:与`char const *p;`相同,指针可以改变,但指向的值不可改变。
3. **字符串比较与内存地址**
字符串字面量如`"abc"`在内存中位于常量区域,多个字符串字面量可能共享同一段内存,因此直接比较地址不一定是正确的比较方式。
4. **sizeof 运算符的限制**
在函数体内,`sizeof`运算符用于数组时只能测量静态数组的大小,对于动态数组或外部数组则无效。这是因为传递给函数的数组名退化为指针。
5. **32位机器的指针位数**
在32位系统中,指针的位数为32位,即4个字节。这是因为地址总线的宽度决定了指针的最大值,从而确定了指针的位数。
- 1
- 2
前往页