面试题详解

前言:这一期我们专门来巩固所学知识,同时见识一些面试题。对知识做出一个总结。

1 不创建临时变量交换两个整数

. 第一种方法

#include<stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前a=%d,b=%d\n", a, b);a = a + b;//此时a存放的不再是原来的值,而是a与b的和,意味着a的值已经被改掉了b = a - b;//b依然是原来的值,此时a-b相当于a+b-b就应该等于原来a的值a = a - b;//此时b存放的是原来a的值,a依然等于a+b的和,所以a-b就相当于a+b-a就应该等于原来b的值printf("交换后a=%d,b=%d", a, b);return 0;
}

. 第二种方法

#include<stdio.h>
int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前a=%d,b=%d\n", a, b);a = a ^ b;//此时a存放的是a^b的值,a的值已经被改掉了b = a ^ b;//b存放的依然是原来的值,那么a^b就相当于a^b^b就等于原来a的值a = a ^ b;//此时b存放的是原来a的值,a^b就相当于a^b^a就等于原来b的值printf("交换后a=%d,b=%d\n", a, b);return 0;
}

这里就需要大家去自行回顾按位异或的知识了。

2 数组笔试题

. 整型数组

#include<stdio.h>
int main()
{//整型数组,数组大小为4,每一个元素类型都是int类型int a[] = { 1,2,3,4 };printf("%zd\n", sizeof(a));// 16//sizeof(a)求的是整个数组的大小,单位是字节printf("%zd\n", sizeof(a + 0));// 4/8//a作为数组名,代表首元素的地址,a+0跳过0个整型,依然指向数组首元素的地址,地址的大小与平台的大小有关printf("%zd\n", sizeof(*a));// 4//a数组名,代表数组首元素的地址,*a对a进行解引用,指向数组首元素(整型)printf("%zd\n", sizeof(a + 1));// 4/8//a数组名,代表数组首元素的地址,a+1跳过1个整型,指向下一个元素的地址,地址的大小与平台有关printf("%zd\n", sizeof(a[1]));// 4//[]下标引用操作符,a[1]访问的是下标为1的元素(整型)printf("%zd\n", sizeof(&a));// 4/8//&a取出的是整个数组的地址,地址的大小与平台有关printf("%zd\n", sizeof(*&a));// 16//*&a相当于a,sizeof(a)求的是整个数组的大小,单位是字节printf("%zd\n", sizeof(&a + 1));// 4/8//&a+1跳过整个数组,指向下一段空间的地址printf("%zd\n", sizeof(&a[0]));// 4/8//a[0]访问的是下标为0的元素,&a[0]取出的是下标为0元素的地址printf("%zd\n", sizeof(&a[0] + 1));// 4/8//&a[0]+1跳过1个整型,指向下标为1元素的地址return 0;
}

. 字符数组

sizeof

#include<stdio.h>
int main()
{//字符数组arr里是没有\0的char arr[] = { 'a','b','c','d','e','f' };printf("%zd\n", sizeof(arr));//6//sizeof(arr)求的是整个数组的大小,单位是字节printf("%zd\n", sizeof(arr + 0));//4/8//arr数组名,代表数组首字符的地址,arr+0依然代表数组首字符的地址,地址大小与平台有关printf("%zd\n", sizeof(*arr));//1//*arr相当于数组首字符a,是一个字符型printf("%zd\n", sizeof(arr[1]));//1//arr[1]访问的是数组下标为1的元素,b是一个字符型printf("%zd\n", sizeof(&arr));//4/8//&arr取出的是整个数组的地址,地址的大小与平台有关printf("%zd\n", sizeof(&arr + 1));//4/8//&arr+1跳过整个数组,指向下一段空间的地址printf("%zd\n", sizeof(&arr[0] + 1));//4/8//arr[0]访问的是数组下标为0的元素,&arr[0]取出的是数组下标为0元素的地址,&arr[0]+1跳过一个字符型,指向下标为1元素的地址return 0;
}

strlen

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = { 'a','b','c','d','e','f' };printf("%zd\n", strlen(arr));//随机值//arr数组名,代表数组首字符的地址,strlen(arr)是从数组首字符的地址开始向后找\0,统计\0之前字符的个数printf("%zd\n", strlen(arr + 0));//随机值//arr数组名,代表数组首字符的地址,arr+0依然代表数组首字符的地址printf("%zd\n", strlen(*arr));//err//*arr代表数组首字符a,是一个字符型,而strlen函数的参数需要一个地址printf("%zd\n", strlen(arr[1]));//err//arr[1]访问的是数组下标为1的元素,是一个字符型printf("%zd\n", strlen(&arr));//随机值//&arr取出的是整个数组的地址,数组的地址依然是从数组首字符的地址开始访问printf("%zd\n", strlen(&arr + 1));//随机值-6//&arr+1跳过整个数组,指向下一段空间的地址printf("%zd\n", strlen(&arr[0] + 1));//随机值-1//&arr[0]取出的是数组首字符的地址,&arr[0]+1跳过一个字符型,指向数组下标为1元素的地址return 0;
}
#include<stdio.h>
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));//7//sizeof(arr)求的是数组的大小,单位是字节printf("%zd\n", sizeof(arr + 0));//4/8//arr数组名,代表数组首字符的地址,arr+0依然代表数组首字符的地址,地址的大小与平台有关printf("%zd\n", sizeof(*arr));//1//*arr代表数组首字符a,是一个字符型printf("%zd\n", sizeof(arr[1]));//1//arr[1]访问的是数组下标为1的元素,是一个字符型printf("%zd\n", sizeof(&arr));//4/8//&arr取出的整个数组的地址printf("%zd\n", sizeof(&arr + 1));//4/8//&arr+1跳过整个数组,指向下一段空间的地址printf("%zd\n", sizeof(&arr[0] + 1));//4/8//&arr[0]取出的是数组首字符的地址,&arr[0]+1跳过一个字符型,指向数组下标为1元素的地址return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "abcdef";printf("%zd\n", strlen(arr));//6//arr数组名,代表数组首字符的地址,从这个位置开始向后找\0,统计\0之前字符的个数printf("%zd\n", strlen(arr + 0));//6//arr+0跳过0个字符型,指向数组首字符的地址printf("%zd\n", strlen(*arr));//err//*arr代表数组首字符,而strlen函数的参数需要一个地址printf("%zd\n", strlen(arr[1]));//err//arr[1]访问的是数组下标为1的元素,是一个字符型printf("%zd\n", strlen(&arr));//6//&arr取出的是整个数组的地址,数组的地址也是从数组首元素的地址开始向后访问printf("%zd\n", strlen(&arr + 1));//随机值//&arr+1跳过整个数组,指向下一段空间的地址printf("%zd\n", strlen(&arr[0] + 1));//5//&arr[0]取出的是数组首字符的地址,&arr[0]+1跳过一个字符型,指向下一个字符的地址return 0;
}
#include<stdio.h>
int main()
{char* p = "abcdef";//常量字符串,字符指针p存放的是字符串首字符a的地址printf("%zd\n", sizeof(p));//4/8//sizeof(p)求的是指针的大小,指针就是地址,与平台的大小有关printf("%zd\n", sizeof(p + 1));//4/8//p+1跳过一个字节,指向了字符串中b的地址printf("%zd\n", sizeof(*p));//1//*p就相当于a,是一个字符型printf("%zd\n", sizeof(p[0]));//1//p[0]就相当于*(p+0),访问的是字符串中的a,是一个字符型printf("%zd\n", sizeof(&p));//4/8//&p取出的是一级指针变量p的地址printf("%zd\n", sizeof(&p + 1));//4/8//&p+1跳过一个指针的大小,指向一段未知空间的地址printf("%zd\n", sizeof(&p[0] + 1));//4/8//&p[0]+1跳过一个字符型,指向下一个字符的地址return 0;
}
#include<stdio.h>
#include<string.h>
int main()
{char* p = "abcdef";printf("%zd\n", strlen(p));//6//p存放的是a的地址,strlen从这个位置开始向后统计\0之前字符的个数printf("%zd\n", strlen(p + 1));//5//p+1跳过一个字节,指向字符串中b的地址//printf("%zd\n", strlen(*p));//err//*p就相当于a,strlen函数的参数需要一个地址//printf("%zd\n", strlen(p[0]));//err//p[0]访问的是字符串中首字符a,是一个字符型printf("%zd\n", strlen(&p));//随机值//&p取出的是一级指针变量p的地址printf("%zd\n", strlen(&p + 1));//随机值//&p+1指向一段未知空间的地址printf("%zd\n", strlen(&p[0] + 1));//5//&p[0]+1跳过一个字符型,指向下一个字符的地址return 0;
}

. 二维数组

#include<stdio.h>
int main()
{int a[3][4] = { 0 };//二维数组,每一个元素的类型都是intprintf("%zd\n", sizeof(a));//48//sizeof(a)求的是整个数组的大小,单位是字节printf("%zd\n", sizeof(a[0][0]));//4//a[0][0]访问的是数组首元素,是一个整型printf("%zd\n", sizeof(a[0]));//16//a[0]相当于二维数组第0行的数组名,sizeof(数组名)求的是整个数组的大小,单位是字节printf("%zd\n", sizeof(a[0] + 1));//4/8//a[0]代表二维数组第0行的数组名,数组名代表数组首元素的地址,a[0]+1跳过一个整型,,指向下一个元素的地址printf("%zd\n", sizeof(*(a[0] + 1)));//4//*(a[0]+1)代表的是元素,是一个整型printf("%zd\n", sizeof(a + 1));//4/8//a数组名,代表数组首元素的地址,二维数组的首元素是第0行,a+1就代表第一行的地址printf("%zd\n", sizeof(*(a + 1)));//16//*(a+1)相当于第一行的数组名,sizeof(数组名)求的是第1行数组的大小,单位是字节printf("%zd\n", sizeof(&a[0] + 1));//4/8//&a[0]取出的是第0行数组的地址,&a[0]+1跳过第0行,指向下一行的地址printf("%zd\n", sizeof(*(&a[0] + 1)));//16//*(&a[0]+1)相当于第一行的数组名,sizeof(数组名)求的是第1行数组的大小,单位是字节printf("%zd\n", sizeof(*a));//16//a数组名,代表二维数组第0行的地址,*a相当于第0行的数组名,sizeof(数组名)求的是第0行数组的大小printf("%zd\n", sizeof(a[3]));//16//a[3]相当于二维数组第2行的数组名,sizeof(数组名),求的是二维数组第2行数组的大小return 0;
}

3 指针笔试题

#include<stdio.h>
int main()
{int a[5] = { 1, 2, 3, 4, 5 };int* ptr = (int*)(&a + 1);//&a取出的整个数组的地址,&a+1跳过整个数组,指向下一段空间的地址//ptr是一个整型指针,ptr指向的对象是一个整型printf("%d,%d", *(a + 1), *(ptr - 1));//2  ,  5//a是数组名,代表数组首元素的地址,a+1跳过一个整型,指向下标为1元素的地址,*(a+1)访问的是数组下标为1 的元素//ptr-1向后跳过4个字节,指向下标为4元素的地址,*(ptr-1)访问的是数组下标为4的元素return 0;
}

画图分析

在这里插入图片描述


#include <stdio.h>
int main()
{int a[3][2] = { (0, 1), (2, 3), (4, 5) };//逗号表达式,最后一个表达式的结果就是最后的结果//int a[3][2]={1,3,5};二维数组int* p;p = a[0];//a[0]代表二维数组第0行的数组名,数组名代表数组首元素的地址//a[0]就代表二维数组第0行数组的首元素的地址printf("%d", p[0]);//1//p[0]=*(p+0),p+0跳过0个整型,依然指向二维数组第0行数组首元素的地址return 0;
}
//假设环境是x86环境,程序输出的结果是啥?
#include <stdio.h>
int main()
{int a[5][5] = { {1,2},{2,3},{3,4},{4,5},{5,6} };int(*p)[4];//数组指针,p指向的数组大小为4p = a;//a数组名,代表二维数组第0行数组的地址printf("%p,%d\n", &p[4][2] - &a[4][2], &p[4][2] - &a[4][2]);//指针-指针的绝对值代表指针之间元素的个数//&p[4][2]-&a[4][2]=-4//10000000000000000000000000000100---原码//11111111111111111111111111111011---反码//11111111111111111111111111111100---补码//FF  FF  FF  FCreturn 0;
}

画图分析

在这里插入图片描述


#include <stdio.h>
int main()
{int aa[2][5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 = (int*)(&aa + 1);//&aa取出的是整个数组的地址,&aa+1跳过整个数组,指向下一段空间的地址//ptr1是一个整型指针int* ptr2 = (int*)(*(aa + 1));//aa数组名,代表二维数组首元素的地址,也就是二维数组第0行的地址//aa+1跳过第0行,指向第1行的地址//*(aa+1)相当于二维数组第1行的数组名,数组名代表首元素的地址//ptr2也是一个整型指针printf("%d,%d", *(ptr1 - 1), *(ptr2 - 1));return 0;
}

画图分析

在这里插入图片描述


#include <stdio.h>
int main()
{char* a[] = { "work","at","alibaba" };//pa是一个二级指针char** pa = a;//a数组名,代表数组首元素的地址pa++;printf("%s\n", *pa);//atreturn 0;
}

画图分析

在这里插入图片描述


#include <stdio.h>
int main()
{char* c[] = { "ENTER","NEW","POINT","FIRST" };char** cp[] = { c + 3,c + 2,c + 1,c };//cpp是一个三级指针char*** cpp = cp;printf("%s\n", **++cpp);//POINT//++cpp,cpp指向cp数组下标为1的元素c+2,c+2指向c数组下标为2的元素printf("%s\n", *-- * ++cpp + 3);//ERprintf("%s\n", *cpp[-2] + 3);//ST//cpp[-2]=*(cpp-2)printf("%s\n", cpp[-1][-1] + 1);//EW//cpp[-1][-1]=*(*(cpp-1)-1)return 0;
}

画图分析

在这里插入图片描述


#include<stdio.h>
//在X86环境下
//假设结构体的⼤⼩是20个字节
//程序输出的结构是啥?
struct Test
{int Num;char* pcName;short sDate;char cha[2];short sBa[4];
}*p = (struct Test*)0x100000;
int main()
{//0x表示16进制数字printf("%p\n", p + 0x1);//0x100014//p是一个结构体指针,p+1就跳过一个结构体的大小(20个字节)printf("%p\n", (unsigned long)p + 0x1);//0x100001//p是一个unsigned long int,p+1执行的是整数加法,不存在跳过几个字节printf("%p\n", (unsigned int*)p + 0x1);//0x100004//p是一个unsigned int*的指针,p+1跳过一个unsigned int的大小(4个字节)return 0;
}

结语:今天的内容到此告一段落。制作不易,若各位有所收获,就为小编点点赞吧。

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

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

相关文章

神经网络算法 - 一文搞懂BERT(基于Transformer的双向编码器)

本文将从BERT的本质、BERT的原理、BERT的应用三个方面&#xff0c;带您一文搞懂Bidirectional Encoder Representations from Transformers | BERT。 Google BERT BERT架构&#xff1a; 一种基于多层Transformer编码器的预训练语言模型&#xff0c;通过结合Tokenization、多种E…

Java基于数据库、乐观锁、悲观锁、Redis、Zookeeper分布式锁的简单案例实现(保姆级教程)

1. 分布式锁的定义 分布式锁是一种在分布式系统中用来协调多个进程或线程对共享资源进行访问的机制。它确保在分布式环境下&#xff0c;多个节点&#xff08;如不同的服务器或进程&#xff09;不会同时访问同一个共享资源&#xff0c;从而避免数据不一致、资源竞争等问题。 2…

等保测评服务的业务连续性规划:确保信息安全服务的韧性

在当前的数字化转型浪潮中&#xff0c;信息安全已成为企业运营的关键一环。等保测评服务作为信息安全合规的重要组成部分&#xff0c;其业务连续性规划对于保障服务的稳定性和客户信息资产的安全至关重要。本文将探讨等保测评服务的业务连续性规划策略&#xff0c;旨在构建一个…

树状数组算法

文章目录 树状数组是什么树状数组与线段树的区别与联系树状数组讲解点修&#xff0c;区查&#xff0c;讲解及模板点查&#xff0c;区修讲解及模板 树状数组是什么 树状数组是一种数据结构&#xff0c;提供O(logn)时间内的单点修改和区间求和操作&#xff0c;比线段树有更优的常…

MD编辑器学习笔记

MD编辑器学习笔记 目录标题文本样式列表图片链接代码片数学公式表格部分总结 目录 目录是使用“[TOC](目录&#xff09;”&#xff0c;记住别忘了加上&#xff08;&#xff09;标题 使用#来确定标题&#xff0c;几个#就是几级标题。记住#后面要加上空格文本样式 tips: 在写正…

物流抓取机器人整体设计方案

一、功能简介 1、运行环境&#xff1a;巡线行驶&#xff08;7路数字循迹&#xff0c;麦克纳姆轮车底盘&#xff09; 2、目标识别&#xff1a;颜色识别&#xff08;Maix-II Dock 视觉模块&#xff09; 3、目标定位&#xff1a;视觉测距&#xff08;Maix-II Dock 视觉模块&#x…

VS实⽤调试技巧(附调试例题)

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; VS实⽤调试技巧&#xff08;附调试例题&#xff09; 前言一、什么是bug&#xff1f;二、什么是调试&#xff08;debug&#xff09;&#xff1f;三、Debug和Release四、VS调试快捷键五…

上书房信息咨询:商业项目调研方法有哪些

商业项目调研是为了了解市场需求、竞争情况和目标受众&#xff0c;从而制定合适的商业策略和项目规划。下面是一些常用的商业项目调研方法&#xff1a; 1、市场调查和问卷调查&#xff1a;通过设计和分发问卷&#xff0c;收集潜在顾客和目标市场的意见、偏好和需求。这可以帮助…

linux dig域名DNS 查询与iptables域名ip访问流量限制;PTR 反向解析从 IP 地址到域名的映射

一、域名 dns查询 在 Linux 系统中&#xff0c;你可以使用多种工具和技术来进行 DNS 查询和 IP 限制。以下是一些常用的方法和工具&#xff1a; DNS 查询 dig 命令&#xff1a; dig 是一个强大的命令行工具&#xff0c;用于查询 DNS 信息。 dig example.com你可以指定查询类型…

dockerfile搭建部署LNMP

目录 实验 架构&#xff1a; 实验步骤&#xff1a; nginx部分 mysql部分 php部分 实验 实验&#xff1a;用dockerfile搭建LNMP论坛 架构&#xff1a; 一台docker虚拟机 docker部署nginx 1.22 指定ip地址172.111.0.10 docker部署mysql 8.0.30 指定ip地址…

标准库标头 <execution> (C++17)学习

此头文件是算法库的一部分。本篇介绍策略类型的一些应用示例&#xff1a; 类 is_execution_policy (C17) 测试一个类是否表示某种执行策略 (类模板) 在命名空间 std::execution 定义 sequenced_policyparallel_policyparallel_unsequenced_policyunsequenced_policy (C17)(C1…

外排序之文件归并排序实现

外排序介绍 外排序是指能够处理极大量数据的排序算法。通常来说&#xff0c;外排序处理的数据不能一次装入内存&#xff0c;只能放在读写较慢的外存储器(通常是硬盘)上。外排序通常采用的是⼀种“排序-归并”的策略。在排序阶段&#xff0c;先读入能放在内存中的数据量&#x…

ACCESS 工具注入实战 凡诺靶场

简介 Access数据库注入攻击是一种常见的网络安全&#xff0c;通过注入SQL代码来获取未授权的数据访问权限。这种攻击利用了应用程序与数据库之间的交互漏洞&#xff0c;攻击者通过输入特定的SQL代码片段来操纵数据库查询&#xff0c;从而绕过应用程序的安全机制&#xff0c;获取…

基于x86 平台opencv的图像采集和seetaface6的人脸特征点功能

目录 一、概述二、环境要求2.1 硬件环境2.2 软件环境三、开发流程3.1 编写测试3.2 配置资源文件3.2 验证功能一、概述 本文档是针对x86 平台opencv的图像采集和seetaface6的人脸特征点功能,opencv通过摄像头采集视频图像,将采集的视频图像送给seetaface6的人脸特征点模块从而…

Selenium + Python 自动化测试19(补充-读取各种文件数据操作)

我们的目标是&#xff1a;按照这一套资料学习下来&#xff0c;大家可以独立完成自动化测试的任务。 上一篇我们讨论了数据驱动测试中如何完成重复的测试实例&#xff0c;今天我们补充一些读取各种文件的方法。 本篇文章我们讨论一下如何使用读取txt、CSV、Excel文件&#xff0…

多门店多端平台系统小程序源码

&#x1f525;【健身新纪元】多门店多端分开健身系统&#xff0c;打造你的个性化健身体验&#x1f31f; &#x1f3cb;️‍♀️ 一、告别单一&#xff0c;拥抱多元化健身时代 你还在为找不到合适的健身房而烦恼吗&#xff1f;或是想要随时随地开启健身模式&#xff0c;却受限…

xss靶场 pwnfunction WW3

目录 代码 代码分析 payload构造 结果 代码 <div><h4>Meme Code</h4><textarea class"form-control" id"meme-code" rows"4"></textarea><div id"notify"></div> </div><scri…

ubuntu上cmake3.30.2的安装

引言 安装下载安装包将安装包从windows拷贝到ubuntu解压进入解压后的文件夹执行boostrap编译CMake安装CMake查看是否安装成功 目前的ubuntu系统是20.04.4&#xff0c;用命令行安装了cmake的版本是3.16的&#xff0c;由于项目需要升级cmake到cmake3.22之上&#xff0c;使用命令行…

如何使用cornerstone3D渲染3D影像

&#x1f353; 前言 在日常开发中经常会遇到除了渲染MPR视图外&#xff0c;还需要渲染3D扫描影像&#xff0c;本文从具体的实现、viewport type解读、场景预设等方面来介绍3D具体的实现及涉及到的相关概念。 &#x1f951; 效果演示 点击查看完整代码 &#x1f352; 实现及概…

详细分析 el-progress的基本知识以及用法(附Demo)

目录 前言1. 基本知识2. Demo3. 实战 前言 由于实战项目中有所引用&#xff0c;对此记录基本的知识点&#xff0c;并且以Demo的形式呈现 1. 基本知识 el-progress 是 Element Plus UI 库中的一个进度条组件&#xff0c;用于显示任务的完成情况 可以帮助用户了解某个操作或任…