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

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

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
				;
		}
		else
			return (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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值