当前位置: 首页 > news >正文

C语言笔试题(指针、数组、整数在内存中的存储、结构体......)

文章目录

  • 1.选择题
  • 2.代码题
    • 2.1 模拟实现strncat
    • 2.2 模拟实现strncpy
    • 2.3 编写判断大小端程序
    • 2.4 模拟实现atoi
    • 2.5 BC38 变种水仙花数
    • 2.6 BC98 序列中删除指定数字

今天我们一起来看一些题目

1.选择题

在这里插入图片描述

解析如下:
在这里插入图片描述
正确选项:B
A.参数错误;D.返回值类型错误。


在这里插入图片描述
解析如下:
在这里插入图片描述
正确选项:A
B.返回值为int,不是函数指针;
C.返回的函数指针没有设置参数;
D.返回的函数指针没有返回值。


在这里插入图片描述

解析如下:
正确选项:C
A,第一个括号定义一个数组,成员是int*,因此后面括号里的int*就很奇怪,四不像;
BD.如果是数组,p只能在[ ]右边;
C.如下图所示。

在这里插入图片描述


在这里插入图片描述
解析如下:
根据回调函数的定义,可以判别D项错误,正确的描述为回调函数是调用函数指针指向的函数。
回调函数是一种在编程中常见的概念,它是指将一个函数作为参数传递给另一个函数,并在特定的条件或事件发生时被调用执行的函数。
具体来说,回调函数是作为参数传递给其他函数的函数指针或函数对象。当满足特定条件或事件发生时,调用该函数指针或函数对象,以执行预定义的操作或逻辑。


在这里插入图片描述
正确选项:C
C项,字符串中没有\0,strlen会继续往后读取直到遇见\0,可能计算出随机值。


在这里插入图片描述
正确选项:C
二维数组传参可以省略行,但不能省略列,A项错误;
数组名传参,数组名是数组首元素的地址,如下图,二维数组每一个元素可以看作一维数组,arr[0]地址的类型是int(*arr)[5],C项正确。
在这里插入图片描述


在这里插入图片描述
正确选项:B.D
数组传参,第一种可以传数组,D选项正确。
第二种是数组首元素的地址,数组首元素类型是char*,一级指针char *的地址是二级指针char **,因此B项正确。
也可以是void test(char * arr[ ]);


在这里插入图片描述

正确选项:B
如下图所示,ptr被强转为int*,-1后解引用访问一个字节,即1;a+1解引用得到4.

在这里插入图片描述


在这里插入图片描述
正确选项:A
如下图.
在这里插入图片描述


在这里插入图片描述
正确选项:C
如下图所示.
在这里插入图片描述


在这里插入图片描述
正确选项:B
解析如下图所示.
在这里插入图片描述


在这里插入图片描述
正确选项:A
解析如下图所示.
在这里插入图片描述


在这里插入图片描述

正确选项:C
解析如下图所示.
在这里插入图片描述


在这里插入图片描述
正确选项:C
unsigned char取值范围-128~127,a+b=300,以%d打印,结果就是300,因为int是存得下300的;如下图所示,c存不下300,127+1变成-128,127+128+45=300,因此结果是44.
在这里插入图片描述


在这里插入图片描述
正确选项:C
a的成员为-1,-2,…,-127,128,…,1,0(如上题图)
strlen遇’\0’停止计算,-1,-2,…,-127,128,…,1共255个数。


在这里插入图片描述
正确选项:D
是变量名,不是类型名。


在这里插入图片描述
正确选项:C
结构体students的内存分布如下所示.
在这里插入图片描述


在这里插入图片描述
正确选项:D
sizeof是计算大小的.


在这里插入图片描述
正确选项:B
.的优先级高于*,因此,B项对p.a解引用,p.a是结构体成员,不能解引用。


在这里插入图片描述
正确选项:C
如下图所示,所有成员最大对齐数是4,大小是4的倍数,因此是12.
在这里插入图片描述


在这里插入图片描述
正确答案:C
如下图所示,A,B的大小分别是16,12.
在这里插入图片描述


  1. 下面代码的结果是:( )
#pragma pack(4)/*编译选项,表示4字节对齐 平台:VS2013。语言:C语言*/
//假设long 是4个字节
int main(int argc, char* argv[])
{struct tagTest1{short a;char d; long b;   long c;   };struct tagTest2{long b;   short c;char d;long a;   };struct tagTest3{short c;long b;char d;   long a;   };struct tagTest1 stT1;struct tagTest2 stT2;struct tagTest3 stT3;printf("%d %d %d", sizeof(stT1), sizeof(stT2), sizeof(stT3));return 0;
}
#pragma pack()

A.12 12 16
B.11 11 11
C.12 11 16
D.11 11 16

正确选项:A

如下图所示.
在这里插入图片描述


  1. 有如下宏定义和结构定义
#define MAX_SIZE A+B
struct _Record_Struct
{unsigned char Env_Alarm_ID : 4;unsigned char Para1 : 2;unsigned char state;unsigned char avail : 1;
}*Env_Alarm_Record;
struct _Record_Struct *pointer = (struct _Record_Struct*)malloc(sizeof(struct _Record_Struct) * MAX_SIZE);

当A=2, B=3时,pointer分配( )个字节的空间。
A.20
B.15
C.11
D.9

正确选项:D
首先分析位段_Record_Struct的大小,如下图所示,共三个字节,3*2+3=9.
在这里插入图片描述

2.代码题

2.1 模拟实现strncat

char* my_strncat(char* dest, const char* src, int n)
{char* p = dest;while (*p)p++;int i = 0;for (; *src != '\0' && i < n; i++)p[i] = src[i];p[i] = '\0';return dest;
}

2.2 模拟实现strncpy

char* my_strncpy(char* dest, const char* src, int n)
{int i = 0;for (; *src != '\0' && i < n; i++)dest[i] = src[i];dest[i] = '\0';return dest;
}

2.3 编写判断大小端程序

写一个函数判断当前机器是大端还是小端,如果是小端返回1,如果是大端返回0.

int check_sys()
{int i = 1;return (*(char *)&i);
}

2.4 模拟实现atoi

自行了解库函数atoi的功能,学习使用,并模拟实现atoi函数。
文档链接:atoi - C++ Reference (cplusplus.com)

#include <stdio.h>
#include <ctype.h>
#include <assert.h>
int state = 0;
int my_atoi(const char* str)
{assert(str!=NULL);if (*str == '\0')return 0;int flag = 1;while (isspace(*str))str++;if (*str == '-'){flag = -1;str++;}else if (*str == '+')str++;else;long long ret = 0;while (*str!='\0'){if (isdigit(*str)){ret = flag * (*str - '0') + ret * 10;if (ret > INT_MAX)return INT_MAX;else if (ret < INT_MIN)return INT_MIN;else;}elsereturn (int)ret;str++;}//正常结束if (*str == '\0')state = 1;return (int)ret;
}
int main()
{printf("%d\n", my_atoi("123"));return 0;
}

2.5 BC38 变种水仙花数

BC38 变种水仙花数

#include <stdio.h>
int main() 
{for (int i = 10000; i <=99999; i++){int sum = 0;for(int j=10;j<=10000;j*=10)sum+=(i%j)*(i/j);if (sum == i)printf("%d ", i);}return 0;
}

2.6 BC98 序列中删除指定数字

BC98 序列中删除指定数字

#include <stdio.h>
int main() {int arr[50]={0};int n,del,j=0;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%d",&arr[i]);scanf("%d",&del);for(int i=0;i<n;i++){if(arr[i]!=del){arr[j]=arr[i];j++;}}for(int i=0;i<j;i++)printf("%d ",arr[i]);return 0;
}

http://www.mrgr.cn/news/8454.html

相关文章:

  • Mac M1Pro 安装Java性能监控工具VisualVM 2.1.9
  • 贪心算法---K次取反后最大化的数组和
  • Lambda 表达式的使用案例
  • Maven的配置文件pom.xml标签详解(含常用plugin)
  • set的所有操作
  • 企业级WEB应用服务器——TOMCAT
  • C库函数signal()信号处理
  • 20L水箱植保无人机技术详解
  • C++设计模式之组合模式详解
  • 【Docker】gitea的ssh容器直通
  • excel vba将选中区域向下复制指定次数
  • 【精选】基于django柚子校园影院(咨询+解答+辅导)
  • C++11:lambda表达式
  • Java 内部类
  • 探索Swift的精髓:玩转Swift标准库
  • Linux 内核源码分析---netfilter 框架
  • Java | Leetcode Java题解之第355题设计推特
  • 靠近光,学习光,成为光
  • m4a格式音频怎么转成mp3?音频转成mp3的8个方法
  • 基于Spark实现大数据量的Node2Vec