(C语言进阶)笔试题详解

news2024/10/5 23:31:10

一.要点回顾

1.一维整形数组 

(1)sizeof()对一维整形数组的应用

#include<stdio.h>
int main()
{
    int a[] = {1,2,3,4};
    printf("%d\n", sizeof(a));//16
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
    printf("%d\n", sizeof(a+0));//  4/8
//a不是单独放在sizeof内部,也没有取地址,所以a就是首元素的地址,故a+0也是首元素的地址
//地址的大小为4/8个字节
    printf("%d\n", sizeof(*a));//4
//*a中的a是数组中首元素的地址,*a就是对首元素的地址解引用,找到的就是首元素
//首元素的大小为4个字节
    printf("%d\n", sizeof(a+1));//  4/8
//这里的a是数组首元素的地址,a+1为第二个元素的地址
//sizeof(a+1)就是地址的大小
    printf("%d\n", sizeof(a[1])); //4
//                sizeof(*(a+1));
//计算的是第二个元素的大小
    printf("%d\n", sizeof(&a)); // 4/8
//&a取出的是整个数组的地址,计算的也是地址
    printf("%d\n", sizeof(*&a));//16
//&a---->int(*)[4]
//&a拿到的是整个数组的地址,解引用后获得整个数组的元素
//故求的是整个数组所占内存的大小
    printf("%d\n", sizeof(&a+1));//  4/8
//&a拿到的是整个数组的地址,+1后跳过一整个数组的大小(16个字节)
//&a+1也是地址,故为4/8个字节
    printf("%d\n", sizeof(&a[0]));//   4/8
//                   sizeof(&*(a+0))
//a[0]是第一个数组元素,取地址后得到的是第一个元素的地址
    printf("%d\n", sizeof(&a[0]+1)); //  4/8
//&a[0]是数组首元素的地址,+1后得到第二个元素的地址
    return 0;
}

2.一维字符型数组 

(1) sizeof()对一维字符型数组的应用

#include<stdio.h>
int main()
{
    char arr[] = { 'a','b','c','d','e','f'};
    printf("%d\n", sizeof(arr));//6
//sizeof(数组名),数组名表示整个数组,计算的是整个数组的大小,单位是字节
    printf("%d\n", sizeof(arr+0));//  4/8
//arr+0是数组首元素的地址
    printf("%d\n", sizeof(*arr));//1
//*arr是数组的首元素,大小为1字节
    printf("%d\n", sizeof(arr[1]));//1
//                  sizeof(*(arr+1))
//为数组的第二个元素
    printf("%d\n", sizeof(&arr));//  4/8
//&arr取出的是整个数组的地址,是地址就是4/8个字节
    printf("%d\n", sizeof(&arr+1)); //  4/8
//&arr+1也是地址,故为4/8个字节
    printf("%d\n", sizeof(&arr[0]+1));// 4/8
//&arr[0]是数组首元素的地址,+1后得到第二个元素的地址
    return 0;
}

(2)strlen()函数对一维字符型数组的应用 

#include<stdio.h>
#include<string.h>
int main()
{
	char arr[] = { 'a','b','c','d','e','f' };
	printf("%d\n", strlen(arr));//随机值
	//strlen函数从指定地址进入后,需要遇到\0才会停止计数
	//字符数组中没有\0,故其会一直向后读取,直到在内存中遇到\0
	printf("%d\n", strlen(arr + 0));//随机值
	//arr+0表示的是数组的首元素地址
	printf("%d\n", strlen(*arr));//错误
	//*arr表示的是数组的首元素'a'
	//strlen需要的参数为指针类型,报错
	printf("%d\n", strlen(arr[1]));//错误
	//arr[1]表示数组的首元素
	//strlen需要的参数为指针类型,报错
	printf("%d\n", strlen(&arr));//随机值
	//&arr取出的是整个数组的地址,而整个数组地址的起始点为首元素地址
	printf("%d\n", strlen(&arr + 1));//随机值-6
	//&arr拿到的是整个数组的地址,+1后跳过一整个数组的大小(6个字节)
	printf("%d\n", strlen(&arr[0] + 1));//随机值-1
	//&arr[0]是数组首元素的地址,+1后得到第二个元素的地址
	return 0;
}

3.字符串 

(1)sizeof()对字符串的应用

#include<stdio.h>    
int main()
{
	char arr[] = "abcdef";
	//[a b c d e f \0]
	printf("%d\n", sizeof(arr));  //7
//arr在sizeof函数中表示全部元素,\0也会计数
	printf("%d\n", sizeof(arr+0));  //  4/8
//第一个元素的地址
	printf("%d\n", sizeof(*arr));  //1
//第一个元素
	printf("%d\n", sizeof(arr[1]));  //1
//第二个元素
	printf("%d\n", sizeof(&arr));  //  4/8
//整个字符串的地址
	printf("%d\n", sizeof(&arr+1));//  4/8
//从首元素地址跳过一整个字符串长度的地址
	printf("%d\n", sizeof(&arr[0]+1)); //  4/8
//第二个元素的地址
	return 0;
}

(2)strlen()对字符串的应用

#include<stdio.h>    
#include<string.h>
int main()
{
	char arr[] = "abcdef";
	//[a b c d e f \0]
	printf("%d\n", strlen(arr));  //6
	//首元素地址
	printf("%d\n", strlen(arr+0)); //6
	//首元素地址
	printf("%d\n", strlen(*arr)); //错误
	//strlen需要的参数为指针类型,报错
	printf("%d\n", strlen(arr[1]));  //错误
	//strlen需要的参数为指针类型,报错
	printf("%d\n", strlen(&arr));  //6
	//首元素地址
	printf("%d\n", strlen(&arr+1));  //随机值
	//首元素地址跳过一整个字符串长度的地址
	printf("%d\n", strlen(&arr[0]+1));  //5
	//第二个元素的地址
	return 0;
}

4.字符型指针 

(1)sizeof()对字符型指针的应用 

#include<stdio.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", sizeof(p));//  4/8
	//p是字符串的首元素地址
	printf("%d\n", sizeof(p+1));// 4/8
	//第二个元素的地址
	printf("%d\n", sizeof(*p));// 1
	//字符串首元素
	printf("%d\n", sizeof(p[0]));// 1
	//字符串首元素
	printf("%d\n", sizeof(&p));// 4/8
	//指向首元素地址的二级指针
	printf("%d\n", sizeof(&p+1));//  4/8
	//指向第二个元素地址的二级指针
	printf("%d\n", sizeof(&p[0]+1));//  4/8
	//             sizeof(&(*(p+0))+1)
	//第二个元素的地址
	return 0;
}

(2)strlen()对字符型指针的应用

#include<stdio.h>
#include<string.h>
int main()
{
	char* p = "abcdef";
	printf("%d\n", strlen(p)); //6
//第一个元素的地址
	printf("%d\n", strlen(p+1));//5
//第二个元素的地址
	printf("%d\n", strlen(*p));//报错
//第一个元素,与strlen所需的参数不同
	printf("%d\n", strlen(p[0]));//报错
//第一个元素,与strlen所需的参数不同
	printf("%d\n", strlen(&p));//随机值1
//整个字符串的地址
	printf("%d\n", strlen(&p+1));//随机值2
//首个元素地址+整个字符串长度的地址
	printf("%d\n", strlen(&p[0]+1)); //5
//第二个元素的地址
	return 0;
}

5.二维整形数组

(1) sizeof()对二维整形数组的应用

#include<stdio.h>
int main()
{
	int a[3][4] = {0};
	printf("%d\n", sizeof(a));//48
//a在sizeof中表示整个数组元素所占的内存大小
	printf("%d\n", sizeof(a[0][0]));//4
//第一个元素
	printf("%d\n", sizeof(a[0]));//16
//第一行元素
	printf("%d\n", sizeof(a[0]+1));//  4/8
//第一行第二个元素的地址
	printf("%d\n", sizeof(*(a[0]+1)));//4
//第一行第二个元素
	printf("%d\n", sizeof(a+1));//  4/8
//第二行元素的地址
	printf("%d\n", sizeof(*(a+1)));//16
//第一行元素
	printf("%d\n", sizeof(&a[0]+1));//  4/8
//第二行元素的地址
	printf("%d\n", sizeof(*(&a[0]+1)));//16
//第二行元素
	printf("%d\n", sizeof(*a));//16
//第一行元素
	printf("%d\n", sizeof(a[3]));//16
//第三行元素
	return 0;
}

 二.笔试题

 1.第一题

题目: 

#include<stdio.h>
int main()
{
	int a[5] = {1,2,3,4,5};
	int* ptr = (int*)(&a+1);
	printf("%d,%d",*(a+1),*(ptr-1));
	return 0;
}

解析:

答案:2,5

#include<stdio.h>
int main()
{
    int a[5] = {1,2,3,4,5};
    int* ptr = (int*)(&a+1);
    //ptr为首元素地址跳过整个数组
    printf("%d,%d",*(a+1),*(ptr-1));//2,5
    return 0;
}

2.第二题 

题目: 

#include<stdio.h>
//已知结构体Test类型的变量大小为20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p=(struct Test*)0x100000;
int main()
{
	printf("%p\n",p+0x1);  //0x100014
	//struct Test类型加一增加20个字节
	printf("%p\n", (unsigned long)p + 0x1);//0x100001
	//unsigned long类型加一增加1个字节
	printf("%p\n", (unsigned int*)p + 0x1);//0x100004
	//unsigned int*类型加一增加4个字节
	return 0;
}

解析:

答案: 0000000000100020 ,0000000000100001  , 0000000000100004

#include<stdio.h>
//已知结构体Test类型的变量大小为20个字节
struct Test
{
    int Num;
    char* pcName;
    short sDate;
    char cha[2];
    short sBa[4];
}*p=(struct Test*)0x100000;
int main()
{
    printf("%p\n",p+0x1);  //0x100014
    //struct Test类型加一增加20个字节
    printf("%p\n", (unsigned long)p + 0x1);//0x100001
    //unsigned long类型加一增加1个字节
    printf("%p\n", (unsigned int*)p + 0x1);//0x100004
    //unsigned int*类型加一增加4个字节
    return 0;
}

3.第三题 

题目: 

#include<stdio.h>
int main()
{
	int a[4] = {1,2,3,4};
	int* ptr1 = (int*)(&a + 1);
	int* ptr2 = (int*)((int)a + 1);
	printf("%x,%x",ptr1[-1],*ptr2);
	return 0;
}

解析:

答案:4,20000

 #include<stdio.h>
int main()
{
    int a[4] = {1,2,3,4};
    int* ptr1 = (int*)(&a + 1);
    //ptr1为数组首元素地址跳过一整个数组的地址
    int* ptr2 = (int*)((int)a + 1);
    //(int)a+1增加一个字节,(int*)((int)a + 1)为首元素地址向后一个字节
//00 00 00 01 | 00 00 00 02 | 00 00 00 03 | 00 00 00 04——数组中元素地址
//01 00 00 00 | 02 00 00 00 | 03 00 00 00 | 04 00 00 00——在内存中存储(小端存储)
//  |                                                  |
// ptr2                                               ptr1
    printf("%x,%x",ptr1[-1],*ptr2);
//以十六进制输出时,ptr1[-1]为后退四个字节,然后读取四个字节输出——00 00 00 04
//*ptr2为读取四个字节然后输出——02 00 00 00
    return 0;
}

4.第四题 

题目: 

#include<stdio.h>
int main()
{
	int a[3][2] = {(0,1),(2,3),(4,5)};
	int* p;
	p = a[0];
	printf("%d",p[0]);
	return 0;
}

 解析:

答案:1

#include<stdio.h>
int main()
{
    int a[3][2] = {(0,1),(2,3),(4,5)};//逗号表达式,读取的值为后面的数
    int* p;
    p = a[0];
    //p为第一行的元素 
    printf("%d",p[0]);
    //p[0]是第一行的第一个元素
    return 0;
}

 

 5.第五题

题目: 

#include<stdio.h>
int main()
{
	int a[5][5];
	int(*p)[4];
	p = a;
	printf("%p,%d\n",&p[4][2]-&a[4][2], &p[4][2] - &a[4][2]);
	return 0;
}

 解析:

答案: -4,FFFFFFFC

#include<stdio.h>
int main()
{
    int a[5][5];
    int(*p)[4];
    p = a;
    printf("%p,%d\n",&p[4][2]-&a[4][2], &p[4][2] - &a[4][2]);
//&p[4][2]-&a[4][2]=(-4)
//10000000 00000000 00000000 00000100——(-4)原码
//11111111 11111111 11111111 11111011——反码
//11111111 11111111 11111111 11111100——补码
//FF FF FF FC——十六进制
//按地址输出时把补码当做地址输出
    return 0;
}

6.第六题 

 题目:

#include<stdio.h>
int main()
{
	int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
	int* ptr1 = (int*)(&aa+1);
	int* ptr2 = (int*)(*(aa + 1));
	printf("%d,%d",*(ptr1-1),*(ptr2-1)); 
	return 0;
}

解析:

答案: 10,5

#include<stdio.h>
int main()
{
    int aa[2][5] = {1,2,3,4,5,6,7,8,9,10};
    int* ptr1 = (int*)(&aa+1);
    //ptr1为首元素地址跳过整个数组后的地址
    int* ptr2 = (int*)(*(aa + 1));
    //          (int*)aa[1]
    printf("%d,%d",*(ptr1-1),*(ptr2-1)); //10,5
    //*(ptr1-1)—>*(a[2]-1)—>a[1][4]
    //*(ptr2-1))—>*(aa[1]-1)—>aa[0][4]
    return 0;
}

7.第七题 

题目: 

#include<stdio.h>
int main()
{
	char* a[] = {"work","at","alibaba"};
	char** pa = a;
	pa++;
	printf("%s\n",*pa);
	return 0;
}

解析:

答案:at 

#include<stdio.h>
int main()
{
    char* a[] = {"work","at","alibaba"};
    char** pa = a;
    //pa为字符串首元素("work")的地址
    pa++;
    //++后pa指向"at"
    printf("%s\n",*pa);
    return 0;
}

8.第八题 

题目: 

#include<stdio.h>
int main()
{
	char* c[] = {"ENTER","NEW","POINT","FIRST"};
	char** cp[] = {c+3,c+2,c+1,c};
	char*** cpp = cp;
	printf("%s\n", **++cpp);
	printf("%s\n", *--*++cpp+3);
	printf("%s\n", *cpp[-2]+3);
	printf("%s\n", cpp[-1][-1]+1);
	return 0;
}

解析:

答案: POINT,ER,ST,EW

#include<stdio.h>
int main()
{
    char* c[] = {"ENTER","NEW","POINT","FIRST"};
    char** cp[] = {c+3,c+2,c+1,c};
    char*** cpp = cp;
    //cpp为c+3的地址


    printf("%s\n", **++cpp);//POINT
    //++cpp—>c+2的地址
    // **++cpp—>"POINT"的首元素地址

    printf("%s\n", *--*++cpp+3);//ER
    //cpp为c+2的地址
    //++cpp—>c+1的地址
    //--*++cpp—>c+1-1—>c
    //*--*++cpp—>"ENTER"的首元素地址
    //*--*++cpp+3—>"ENTER"第四个元素的地址

    printf("%s\n", *cpp[-2]+3);//ST
    //cpp为c+1的地址
    //cpp[-2]—>*(cpp-2)—>元素c+3—>"FIRST"的地址
    //*cpp[-2]+3—>*(cpp[-2]+3)—>"FIRST"的第四个元素的地址

    printf("%s\n", cpp[-1][-1]+1);//EW
    //cpp为c+1的地址
    //cpp[-1]—>*(cpp-1)—>元素c+2—>"POINT"的地址
    //cpp[-1][-1]—>*(cpp[-1]-1)—>"NEW"的地址
    //cpp[-1][-1]+1—>"NEW"第二个元素的地址
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1091337.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序备案流程操作详解

1、2023年9月1号小程序开始必须备案了,各位小程序商城只需要按流程自主去微信小程序后台操作即可; 2、对未上架的微信小程序,从2023年9月1号开始需先备案才能上架; 3、对存量已上架的小程序,需在2024年3月31号前完成备案即可。逾期未完成备案,平台将按照备案相关规定于…

英语学习工具推荐

无论您是初学者还是想要巩固英语能力的学习者&#xff0c;我们都为您提供了一个高效而便捷的英语学习工具。 英语复读机&#xff0c;您可以随时输入您想要复读的英语单词、句子或者文章。我们的复读机会循环播放您输入的内容&#xff0c;帮助您加深记忆、提高听力和口语表达能力…

相似性搜索:第 2 部分:产品量化

系列文章前篇&#xff1a;相似性搜索&#xff1a;第 1 部分- kNN 和倒置文件索引_无水先生的博客-CSDN博客 SImilarity 搜索是一个问题&#xff0c;给定一个查询的目标是在所有数据库文档中找到与其最相似的文档。 一、介绍 在数据科学中&#xff0c;相似性搜索经常出现在NLP领…

模式匹配(数据结构)

朴素模式匹配算法 #include <stdlib.h> #include <iostream> #include <stdio.h> #define MaxSize 255typedef struct{char ch[MaxSize];int length; }SString;//初始化 SString InitStr(SString &S){S.length0;return S; } //给串赋值 SString SetStr…

【计算机毕设选题推荐】产品管理系统SpringBoot+SSM+Vue

前言&#xff1a;我是IT源码社&#xff0c;从事计算机开发行业数年&#xff0c;专注Java领域&#xff0c;专业提供程序设计开发、源码分享、技术指导讲解、定制和毕业设计服务 项目名 基于SpringBoot和SSM的产品管理系统 技术栈 SpringBootSSMVueMySQLMaven 文章目录 一、产品…

pip 安装dgl的问题

在该官网链接找到需要的对应包&#xff1a; 官网链接 安装之后可能的问题&#xff1a; 这个时候应该是网络问题导致的&#xff0c;这个时候可以自行前往网站下载 下载之后安装&#xff1a; 发现缺少依赖 p s u t i l psutil psutil&#xff0c;于是前往官网下载&#xff1a;…

C语言数据类型详解

1、什么是数据类型&#xff1f; 计算机编程语言是用来控制计算机的行为及操作&#xff0c;协助人们解决现实中的问题&#xff0c;其能表达的数据类型也是从实际中提取并抽象出来形成的数据结构描述。 例如&#xff1a;数学中数的基础分类有正整数、负整数、小数等类别&#x…

Linux系统编程:makefile以及文件系统编程

增量编译概念 首先回顾一下我们之前写的各种gcc指令用来执行程序&#xff1a; 可以看见非常繁琐&#xff0c;两个文件就要写这么多&#xff0c;那要是成百上千岂不完蛋。 所以为了简化工作量&#xff0c;很自然的想到了将这些命令放在一起使用脚本文件来一键执行&#xff0c…

Python+requests+Excel数据驱动的接口自动化测试中解决接口间数据依赖

在实际的测试工作中&#xff0c;在做接口自动化过程中往往会遇到接口间数据依赖问题&#xff0c;即API_03的请求参数来源与API_02的响应数据&#xff0c;API_02的请求参数又来源与API_01的响应数据&#xff0c;因此通过自动化方式测试API_03接口时&#xff0c;需要预先请求API_…

Linux下将驱动编译进内核

在开发的过程中&#xff0c;一般都是将驱动编译成模块&#xff0c;然后将其发送到开发板加载驱动进行功能验证&#xff0c;驱动的功能验证没有问题后就可以将其编译进内核了。本文将介绍如何把上一篇文章Linux下设备树、pinctrl和gpio子系统、LED灯驱动实验中的LED驱动编译到内…

[题] 前缀和 (含输入输出的耗时对比)

题目 前缀和 题解 前缀和模板 太简单了就多加了点东西:对比cin cout和scanf printf的耗时对比 代码 #include <iostream> using namespace std; const int N 100010; int n, m; int a[N], s[N]; int main(){scanf("%d%d", &n, &m);//原数组 for (in…

CentOS 挂载新磁盘以及磁盘扩容操作教程

1.搭载新加磁盘 # 查看磁盘 fdisk -l #新盘&#xff08;/dev/sdb&#xff09;创建分区 #虚拟机 fdisk /dev/sdb #阿里云 fdisk /dev/vdb #创建/dev/sdb1为新的PV&#xff08;物理卷&#xff09; 【创建物理卷命令】 #虚拟机 pvcreate /dev/sdb1 #阿里云 pvcreate /dev/vdb1 查…

Air001 ADC内部输入通道温度传感器读取

Air001 ADC内部输入通道温度传感器读取 &#x1f4cb;Air001 内部集成的温度传感器说明 &#x1f58d;温度传感器产生一个随温度线性变化的电压。温度传感器在内部被连接到ADC内部的输入通道上&#xff0c;用于将传感器的输出转换成数字数值。 &#x1f4d3;Air001模拟/ 数字转…

CANdb++数据库操作

CANdb数据库操作 创建工程结构文件夹新建数据库&总线描述节点设置节点创建配置Message属性信号设置节点收发信号 环境变量配置一致性检验数据库工程XVehicle.dbc导入工程文件总结 创建工程结构文件夹 在文件夹X-Vehicle-1下&#xff0c;建立工程目录文件夹CANdb&#xff0…

优雅而高效的JavaScript——模板字面量

&#x1f928;博主&#xff1a;小猫娃来啦 &#x1f928;文章核心&#xff1a;优雅而高效的JavaScript——模板字面量 文章目录 什么是模板字面量使用模板字面量插入变量处理多文本模板字面量的高级应用标签模板字量自定义模板字面量函数 常见应用场景拼接字符串HTML模板SQL查询…

【LeetCode热题100】--347.前K个高频元素

347.前K个高频元素 方法&#xff1a;堆 首先遍历整个数组&#xff0c;并使用哈希表记录每个数字出现的次数&#xff0c;并形成一个「出现次数数组」。找出原数组的前 k 个高频元素&#xff0c;就相当于找出「出现次数数组」的前 k 大的值 利用堆的思想&#xff1a;建立一个小…

tomcat多实例部署jenkins

tomcat多实例部署jenkins 文章目录 tomcat多实例部署jenkins1.简介&#xff1a;2.优缺点&#xff1a;3.工作原理&#xff1a;4.工作流程&#xff1a;5.tomcat多实例部署jenkins流程5.1.环境说明5.2.部署前准备工作5.3.多实例部署tomcat5.4.部署jenkins5.5.创建一个jenkins项目5…

乐高Studio打开Solidworks零件/装配体 (sw另存obj文件)

solidworks 2020 Lego studio / part designer 截至2023-10-13&#x1f382;最新版 文章目录 操作步骤1&#xff09; solidworks 开启 ScanTo3D 功能2&#xff09; 零件 / 装配体 保存至stl格式文件3&#xff09; 以SanTo3D网格文件方式打开stl4&#xff09; 将打开的stl另存为…

销毁二叉树

同样是利用递归的方法——后序遍历 void TreeDestroy(BTNode* root) {if (root NULL){return 0;}TreeDestroy(root->left);TreeDestroy(root->right);free(root);}