目录
选择题
(1)
解析:
(2)
解析:
(3)
解析:
(4)
解析:
(5)
解析:
编程题
题一
描述
示例
提示
解析:
代码实现
题二
描述
示例
解析:
代码实现
总结
选择题
(1)
1、有以下函数,该函数的功能是( )
int fun(char *s)
{
char *t = s;
while(*t++);
return(t-s);
}
A: 比较两个字符的大小 B: 计算s所指字符串占用内存字节的个数
C: 计算s所指字符串的长度 D: 将s所指字符串复制到字符串t中
答案: B
解析:
循环在*t为0时停止,同时t++,t最后会停在字符串结束的'\0'之后的一个位置,t作为尾部指针减去头部指针就是整个字符串占用内存的字节数,包含\0在内;而c答案字符串长度不包括最后的\0
(2)
2、若有“ float a[3]={1.5,2.5,3.5},*pa=a;*(pa++)*=3; ”,则 *pa 的值是( )
A: 1.5 B: 2.5 C: 3.5 D: 4.5
答案:B
解析:
在*pa=a中指针pa指向a[0];pa++返回值仍是操作之前的值;*(pa++)取pa指向的地址的值;*(pa++)*=3将该值变为原来的3倍,也就是数组a的第一个值为4.5;由于pa++之后pa指针移动了sizeof(float)个字节,所以pa指向a[1],所以值为2.5
(3)
3、以下程序运行后的输出结果是( )
#include <stdio.h>
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p = a + 5, *q = NULL;
*q = *(p+5);
printf("%d %d\n", *p, *q);
return 0;
}
A: 运行后报错 B: 6 6 C: 6 11 D: 5 10
答案:A
解析:
指针q初始化为NULL,接着又解引用指针q,是错误的,对NULL指针是不能解引用的。
(4)
4、设有定义 char *p[]={"Shanghai","Beijing","Honkong"}; 则结果为 j 字符的表达式是( )
A: *p[1] +3 B: *(p[1] +3) C: *(p[3] +1) D: p[3][1]
答案:B
解析:
B选项,p是个char*类型的数组,p[1]拿到字符串"beijing"的首地址,再加3便是'j'的地址,解地址拿到'j'
(5)
5、以下叙述中正确的是( )
A: 即使不进行强制类型转换,在进行指针赋值运算时,指针变量的基类型也可以不同
B: 如果企图通过一个空指针来访问一个存储单元,将会得到一个出错信息
C: 设变量p是一个指针变量,则语句p=0;是非法的,应该使用p=NULL;
D: 指针变量之间不能用关系运算符进行比较
答案:B
解析:
A 选项描述不正确,不同类型指针一般不可以直接赋值;C选项中,p=NULL;和p=0;是等价的;D选项中,指向同一数组的两指针变量进行关系运算可表示它们所指数组元素之间的位置关系。B选项正确
编程题
题一
描述
珠玑妙算游戏(the game of master mind)的玩法如下。
计算机有4个槽,每个槽放一个球,颜色可能是红色(R)、黄色(Y)、绿色(G)或蓝色(B)。例如,计算机可能有RGGB 4种(槽1为红色,槽2、3为绿色,槽4为蓝色)。作为用户,你试图猜出颜色组合。打个比方,你可能会猜YRGB。要是猜对某个槽的颜色,则算一次“猜中”;要是只猜对颜色但槽位猜错了,则算一次“伪猜中”。注意,“猜中”不能算入“伪猜中”。
给定一种颜色组合solution
和一个猜测guess
,编写一个方法,返回猜中和伪猜中的次数answer
,其中answer[0]
为猜中的次数,answer[1]
为伪猜中的次数。
示例
提示
解析:
遍历两个数组,统计猜中次数和伪猜中次数
猜中次数:若位置相同且颜色字符也相同在猜中次数计数器+1
伪猜中次数:颜色相同,但是在不同位置,这时候只需要除去猜中位置之外,统计两个数组中各个字符出现的数量,取较小的一方就是每种颜色伪猜中的数量了
代码实现
int* masterMind(char* solution, char* guess, int* returnSize) {
*returnSize = 2;
static int arr[2] = { 0 };
arr[0] = 0; arr[1] = 0;//静态空间不会进行二次初始化因此每次重新初始化,可以使用memset函数
int s_arr[26] = { 0 };//26个字符位 solution 四种颜色数量统计
int g_arr[26] = { 0 };//26个字符位 guess 四种颜色数量统计
for (int i = 0; i < 4; i++) {
if (solution[i] == guess[i]) {
arr[0] += 1;//位置和颜色完全一致则猜中数量+1
}
else {
//统计同一位置不同颜色的两组颜色数量,伪猜中不需要对应位置相同,只需要有对应数量的颜色就行
s_arr[solution[i] - 'A'] += 1; //统计solution对应颜色字符出现次数
g_arr[guess[i] - 'A'] += 1;//统计guess对应颜色字符出现次数
}
}
//在两个颜色数量统计数组中查看颜色数量,取相同位置较小的一方就是为猜中数量
for (int i = 0; i < 26; i++) {
arr[1] += s_arr[i] > g_arr[i] ? g_arr[i] : s_arr[i];
}
return arr;
}
题二
描述
给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)
示例
解析:
在数组中拿到一个数字 num 后,在剩下的数字中查找是否有等于 target - num 的数字即可。
代码实现
int* twoSum(int* numbers, int numbersLen, int target, int* returnSize) {
*returnSize = 2;
static ret_arr[2] = { 0 };
memset(ret_arr, 0x00, sizeof(ret_arr));//静态空间不会二次初始化,因此手动初始化
for (int i = 0; i < numbersLen; i++) {//从第0个位置开始一个一个数字找
for (int j = i + 1; j < numbersLen; j++) {//从第一个数字往后的数字中找出另一个数字
//与numbers[i]相加等于target的数字找到了则i和j就是对应两个数字下标
if (numbers[i] + numbers[j] == target) {
ret_arr[0] = i + 1;//题目要求下标从1开始
ret_arr[1] = j + 1;
return ret_arr;
}
}
}
*returnSize = 0;//没有符合的下标则返回数组大小为0;
return NULL;
}
总结
关于今日练习讲解到这儿,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下。