面试题详解

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

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.rhkb.cn/news/407429.html

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

相关文章

深度学习 --- VGG16卷积核的可视化(JupyterNotebook实战)

VGG16卷积核的可视化 在前一篇文章中&#xff0c;我对VGG16输入了一张图像&#xff0c;并实现了VGG16各层feature map的可视化。深度学习 --- VGG16各层feature map可视化(JupyterNotebook实战)-CSDN博客文章浏览阅读615次&#xff0c;点赞13次&#xff0c;收藏15次。在VGG16模…

Linux三剑客-sedawk

一、三剑客-sed命令 1、格式 sed 找谁干啥 文件 找谁:条件&#xff0c;匹配哪一行&#xff0c;哪些行. 干啥:动作&#xff0c;增删改查. #显示文件的第3行 sed -n 3p /etc/passwd选项说明-n取消默认输出-p查找-rsed支持扩展正则-i修改文件内容&#xff0c;这个选项放在最后…

【C++ Primer Plus习题】3.5

问题: 解答: #include <iostream> using namespace std;int main() {long long populationWorld 0;long long populationChina 0;cout << "请输入全球的人口数:";cin >> populationWorld;cout << "请输入中国的人口数:";cin &g…

XSS- - - DOM 破坏案例与靶场

目录 链接靶场&#xff1a; 第一关 Ma Spaghet 第二关 Jefff 第三关 Ugandan Knuckles 第四关 Ricardo Milos 第五关 Ah Thats Hawt 第六关 Ligma 第七关 Mafia 第八关 Ok, Boomer 链接靶场&#xff1a; XS…

GenAI 的产品:快速行动,但失败

2022 年秋季&#xff0c;我正在做一个很酷的项目。是的&#xff0c;你猜对了——使用公司特定的数据对预先训练的 LLM&#xff08;Bert&#xff09;进行微调。 然而&#xff0c;很快 ChatGPT 就发布了&#xff0c;并席卷了全世界。既然已经有一门非常强大的 LLM 了&#xff0c…

ARM——驱动——inmod加载内核模块

在上一篇文章的代码上添加出错处理 #include <linux/init.h> // 包含初始化宏和函数 #include <linux/kernel.h> // 包含内核函数和变量 #include <linux/fs.h> // 包含文件操作的结构和函数 #include <linux/kdev_t.h> /…

PyTorch——transforms

接着上一篇&#xff0c;我们这一篇讲transforms 1、什么是transform 首先transform是来自PyTorch的一个扩展库——【torchvision】&#xff0c;【torchvision】这个库提供了许多计算机视觉相关的工具和功能&#xff0c;能够在神经网络中&#xff0c;将图像、数据集、预处理模型…

【系统架构设计】软件架构设计(1)

【系统架构设计】软件架构设计&#xff08;1&#xff09; 软件架构概述架构需求与软件质量属性软件架构风格数据流风格批处理序列管道-过滤器2者风格比较 仓库风格--黑板系统 层次系统架构风格二层及三层C/S架构风格MVCMVP 面向服务的架构 软件架构概述 基于架构的软件开发模型…

网络通信tcp

一、udp案例 二、基于tcp: tcp //c/s tcp 客户端: 1.建立连接 socket bind connect 2.通信过程 read write close tcp服务器: 1.建立连接 socket bind listen accept 2.通信过程 read write close connect函数 int connect(int sockfd, con…

postgresql 集群文档

https://www.cnblogs.com/Alicebat/p/14148933.html [命令] Pacemaker 命令 pcs cluster &#xff08;管理节点&#xff09; – Eternal Center PostgreSQL实战之物理复制和逻辑复制&#xff08;五&#xff09;_postgresql 流复制和物理复制-CSDN博客 https://jingyan.baidu…

【Windows】深度学习环境部署

引言 1 Windows环境准备 1.1 VSCode Visual Studio Code&#xff08;简称 VSCode&#xff09;是一款由微软开发的开源代码编辑器。它非常受开发者欢迎&#xff0c;因为它功能强大、扩展性好&#xff0c;并且支持多种编程语言。VSCode 尤其适合 Python 开发&#xff0c;特别是…

网络 通信

一、客户端接收(也可以bind) 1. socket socket 函数 用于创建一个套接字&#xff08;socket&#xff09;&#xff0c;这是网络通信的基础。 它的原型如下&#xff1a;int socket(int domain, int type, int protocol); 参数&#xff1a; domain&#xff1a;指定协议族&…

虚幻5|AI视力系统,听力系统,预测系统(3)预测系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;2&#xff09;听力系统-CSDN博客 一&#xff0c;添加一个AI预感感官配置 1.选中我们的AIPerception,右侧细节添加一个AI预感感官配置&#xff0c;然后我们把所有感官的年龄都调成5&#xff0c;是所有 2…

全网最简单的Java设计模式【九】策略模式-实战中最常用的设计模式之一

策略模式是一种行为设计模式&#xff0c;它允许你定义一系列的算法&#xff0c;把它们一个个封装起来&#xff0c;并且使它们可以相互替换。该模式让算法的变化独立于使用算法的客户。在实际开发中&#xff0c;策略模式可以帮助我们减少大量的 if-else 或 switch 条件判断语句&…

premiere2023暴力压缩视频

目录 1. 需求说明2. 压缩流程 1. 需求说明 要将三段视频拼接起来&#xff0c;时长超过了1h&#xff0c;然后压缩到200M以内的视频。 这是三段视频的信息&#xff1a; 合并三个视频文件意味着总时长增加了。较长的视频文件通常也会更大&#xff0c;即使比特率相同。 当我把三段…

vscode 阅读linux内核(vscode+clangd)

此插件曾在vim里用过&#xff0c;非常好用。 首先先在vscode 里下载clangd插件 这只是客户端&#xff0c;还需下载个服务器&#xff08;这在coc插件里也有说明&#xff09; sudo apt install clangd 下载完后可以 clangd --version 查看版本信息&#xff0c;如果能查看&#x…

UE5 日期时间蓝图变量 加减节点

参考链接&#xff1a;Having troubles with DateTime in UE5 - General / Feedback & Requests - Epic Developer Community Forums (unrealengine.com) 直接粘贴到UE5蓝图图表可用。&#xff08;反之相加&#xff0c;用负号操作一下&#xff09; 减号蓝图节点&#xff08;…

8.22-docker的部署及其使用

docker 1.docker环境部署以及语法 [rootdocker ~]# cat << EOF | tee /etc/modules-load.d/k8s.conf> overlay> br_netfilter> EOFoverlaybr_netfilter[rootdocker ~]# modprobe overlay[rootdocker ~]# modprobe br_netfilter[rootdocker ~]# cat /etc/module…

AI绘画工具 Stable Diffusion【插画转绘】:建筑 | 风景| 人像照片的插画转绘制作教程,照片秒变插画风格图片!

大家好&#xff0c;我是画画的小强 关于Stable Diffusion 的插画转绘&#xff0c;今天给大家分享一种制作方法。我们先看一下效果图。 一. 图片转插画的制作方法 本期教程我们将使用AI绘画工具Stable Diffusion&#xff0c;关于SD的安装和入门使用可以看看我的往期入门教程…

122-域信息收集应用网络凭据CS插件AdfindBloodHound

参考&#xff1a;【内网安全】域信息收集&应用网络凭据&CS插件&Adfind&BloodHound_ladon adfinder bloodhound-CSDN博客 工作组和域环境 我的理解&#xff1a; 工作组就是还是局域网一样只是大一点里面的电脑很多&#xff0c;每个电脑还是都是单独的电脑没有…