🗒️前言:
在前面我们学习完C语言的所以知识,当然练习巩固也不能落下。俗话说:“无财之谓贫,学而不能行之谓病。”可见实践对我们学习的重要。接下来就让小王带着大家进行练习,巩固我们C语言的学习。
一、选择题
📝1.第一题
请指出以下程序哪步有错误【多选】( )
void GetMemory(char** p, int num) { if (NULL == p && num <= 0)//1 { return; } *p = (char*)malloc(num); return; } int main() { char* str = NULL; GetMemory(&str, 80); //2 if (NULL != str) { strcpy(&str, "hello"); //3 printf(str); //4 } return 0; }
💡解题思路:
- 代码1错误:通过观察代码我们可以知道这个函数的功能是要动态开辟空间,num 是开辟空间的大小不能为0,p 是二级指针不能为空指针,这两个条件有一个不满足,程序就会出错,所以应该使用 || 。
- 代码2正确:在代码2中传入 str 的地址,在语句 char*str=NULL;中str初始化为空指针,但是 str 指针变量也有地址,所以 p 保存的是指针变量 str 的地址,所以调用GetMemory函数之后,动态开辟的空间的地址存放在了str中。
- 代码3错误:这里是要进行字符串的拷贝,要传递的是字符串的地址,而这里使用了&符号,传递的是地址的地址,所以是错误的。
📝2.第二题
已知 i,j 都是整型变量,下列表达式中,与下标引用 X[i][j] 不等效的是【多选】( )
A、*(X[i]+j) B、*(X+i)[j] C、*(X+i+j) D、*(*(X+i)+j)
💡解题思路:
X [ i ][ j ]表示取二维数组的第 i 行,第 j 列
- A选项:在二维数组中X[ i ]表示的是第 i 行首元素的地址,再加 j,表示找到第 i 行的第 j 个元素的地址,在解引用就可以找到这个元素啦。
- B选项:我们知道数组名是首元素的地址所以 X 是二维数组第一行的地址,加 i 找到第 i 行,这里要注意 ()、[] 的优先级比 * 的优先级高,所以 * 最后执行。由 arr[i]=*(arr+i),可得 *(*( (X+i)+j) ),这样是错误的。
- C选项:X是二维数组的数组名,数组名相当于第一行的地址,X+i+j,跳过了i+j行,就越界了,也是错误的。
- D选项:*(X+i) 等价于 X[ i ], *(X[ i ]+j) 就等价于 X[ i ][ j ]。
📝3.第三题
下面这个程序执行后会有什么错误或者效果【多选】( )
#define MAX 255 int main() { unsigned char A[MAX], i; for (i = 0; i <= MAX; i++) { A[i] = i; } return 0; }
💡解题思路:
- 我们通过观察代码可以看到数组的大小为255,所以它的下标是 0-254,i<=MAX 条件都满足,i=255,进入循环 A[255]=i 会出现越界访问。
- A是无符号字符型,它的取值范围是 0-255,255在加1时,就会变成0重新循环,所以程序会陷入死循环
二、编程题
📝1.第一题
💡解题思路:
我们要统计连续1的个数,使用一个计数器,当遇到连续的1时就++,遇到0时,将计数器清0,重新记录连续1的个数。每次连续的个数记录起来,与上一次的比较,如果当前的个数大于之前的个数就替换,如果不大于就不替换,最终就可以得到最大连续1的个数。
int findMaxConsecutiveOnes(int* nums, int numsSize) { int count = 0; int max = 0; for (int i = 0; i < numsSize; i++) { if (nums[i] == 1) { count++; } else { count = 0; } if (count > max) { max = count; } } return max; }
📝2.第二题
💡解题思路:
我们遍历数组中的每个元素,数组元素的绝对值为几,就把数组第几个元素置为负数,也就是n-1下标的元素。因为数组的元素是1~n,下标的元素是0~n-1。
abs函数是对整数进行取绝对值。因为对一个位置加两个负号,就会变成正数,所以要取绝对值。
int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) { *returnSize = 0; int* new = (int*)malloc(sizeof(int) * numsSize); for (int i = 0; i < numsSize; i++) { //把(元素-1)作为下标 int index = abs(nums[i]) - 1; //将下标对应的值置为负数 //这里取绝对值是防止对重复的位置置为负数 nums[index] = -abs(nums[index]); } for (int i = 0; i < numsSize; i++) { if (nums[i] > 0) { new[*returnSize] = i + 1; (*returnSize)++; } } return new; }
本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。