
🔥个人主页:@草莓熊Lotso 🎬作者简介:C++研发方向学习者 📖个人专栏: 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言:生活是默默的坚持,毅力是永久的享受。
前言:我们距离学习完C语言已经很久了,在数据结构学完后,博主准备通过这16天的强化训练和大家一起回顾C语言的知识,今天依旧是五道选择和两道编程题,希望大家能有所收获。
1、下列程序的输出是( ) A: 上述程序有错误 B: 6 C: 8 D: 12
#include<stdio.h>
int main()
{
int a[12] = { 1,2,3,4,5,6,7,8,9,10,11,12 }, * p[4], i;
for (i = 0; i < 4; i++)
p[i] = &a[i * 3];
printf("%d\n",p[3][2]);
return 0;
}答案解析: 正确答案:D p是一个指针数组,p[i] = &a[i*3]相当于是把数组a每3个一组分开并把每组的首地址存在p数组,此时p类似一个4行3列的二维数组,p[3][2]就是4行第3个元素12
2、二维数组X按行顺序存储,其中每个元素占1个存储单元。若 X[4][4] 的存储地址为 Oxf8b82140 , X[9][9] 的存储地址为 Oxf8b8221c ,则 X[7][7] 的存储地址为( )
A: Oxf8b821c4 B: Oxf8b821a6 C: Oxf8b82198 D: Oxf8b821c0
答案解析: 正确答案:A 假设每行有n个元素:那x[9][9]元素的地址 - x[4][4]元素的地址 = 0x21c-0x140=5n+5(21c和140是地址末三位的十六进制数),这里n是43,假设x[7][7]的地址是z,x[7][7]元素的地址 - x[4][4]元素的地址 = z-0x140 = 3n+3,z = 3n+3+140 = 3*43+3+0x140 = 0x84+0x140 = 0x1c4,看地址的尾数,选择A
3、以下哪个选项可以正确描述 sizeof(double) ( )
A: 一个整型表达式 B: 一个双精度型表达式 C: 一个不合法的表达式 D: 一种函数调用
答案解析: 正确答案:A sizeof是C语言中的一个操作符,不是函数调用,简单的说其作用就是返回一个对象或者类型所占的内存字节数,结果是无符号整数,因此可以把它看作是整型表达式。所以选择A
4、下列代码运行后的结果是什么( ) A: b,b B: b,c C: a,b D: a,c
答案解析: 正确答案:A 变量a里边存的是字符'a',第一次输出先加加再输出,输出的是'b';第二次输出的时候,a先赋值再加加,赋值给b的就是a原来的值,输出b的时候的还是'b'
5、以下逗号表达式的值为( ) A: 25 B: 20 C: 100 D: 45
(x
= 4 * 5 , x * 5) , x + 5;答案解析: 正确答案:A 逗号表达式是从前到后依次计算子表达式,而其结果是最后一项的值,此题去掉括号后的表达式,和原表达式是等价的,先计算4*5并赋值给x,x变为20,中间x*5并没有改变x的值,最后一项x+5值是25,也就是整个表达式的值
题目描述:

题目示例:

代码演示:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
bool isSelfDividing(int num) {
int temp = num;
while (temp > 0) {
int digit = temp % 10;
if (digit == 0 || num % digit != 0) {
return false;
}
temp /= 10;
}
return true;
}
int* selfDividingNumbers(int left, int right, int* returnSize){
int * ans = (int *)malloc(sizeof(int) * (right - left + 1));
int pos = 0;
for (int i = left; i <= right; i++) {
if (isSelfDividing(i)) {
ans[pos++] = i;
}
}
*returnSize = pos;
return ans;
}题目解析:
题目描述:

题目示例:

代码演示:
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* productExceptSelf(int* nums, int numsSize, int* returnSize) {
int*answer=(int*)malloc(sizeof(int)*numsSize);
for(int i=0;i<numsSize;i++)
{
answer[i]=1;
}
for(int i=0;i<numsSize;i++)
{
for(int j=0;j<numsSize;j++)
{
if(j!=i)
answer[i]*=nums[j];
}
}
*returnSize=numsSize;
return answer;
}题目解析:
往期回顾:
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day5
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day6
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day7
【C语言强化训练16天】--从基础到进阶的蜕变之旅:Day8
结语:本篇博客就到此结束了,C 语言的精髓在于对细节的掌控和对底层的理解,这需要持续实践。愿你带着这份训练中获得的思维与习惯,在编程路上走得更稳、更远。如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。