C语言指针进阶(3)

news2024/11/18 19:49:29

这节我们来总结一下指针和数组面试题。

在这节我们主要用到这样几个知识点:

1.数组名是数组首元素的地址。

但是有两个例外:

2.sizeof(数组名),这里的数组名表示整个数组,计算的是整个数组的大小,单位是字节。

3.&数组名,这里的数组名表示整个数组,取出的是整个数组的地址。

 第一组

//一维数组

 int a[] = { 1,2,3,4 };

printf("%d\n", sizeof(a));
//计算的是数组的大小,单位是字节,int类型是4个字节,所以结果是16个字节
printf("%d\n", sizeof(a + 0));
//a代表数组首元素地址,a+0仍然代表数组首元素地址,
//地址的大小统一是4/8个字节(取决于是X86还是X64环境)
printf("%d\n", sizeof(*a));
//a代表数组首元素地址,*a表示对数组首元素地址解引用
//所以结果是计算首元素大小,结果为4
printf("%d\n", sizeof(a + 1));
//a代表数组首元素地址,a+1代表跳过一个整形,代表第一个元素地址
//由于还是地址,所以大小仍然是4/8个字节
printf("%d\n", sizeof(a[1]));
//a[1]代表数组第二个元素,所以结果为4
printf("%d\n", sizeof(&a));
//&a代表数组的地址,为int(*)[4]类型
//但是不管怎么说,还是地址,所以仍然是4/8个字节
printf("%d\n", sizeof(*&a));
//第一个角度:&a代表数组的地址,是int(*)[4]类型
//*&a对数组的地址进行解引用,表示数组名,sizeof(数组名)代表整个数组的大小,16
//第二个角度:*和&可以抵消,相当于啥也没干,*&a==a,这就是脱裤子放屁了,sizeof(a),所以是16
printf("%d\n",sizeof(&a+1));
//&a表示数组的地址,&a+1跳过整个数组,得到下一个数组地址
//但是还是地址,4/8
printf("%d\n",sizeof(&a[0]));
//&a[0]得到a[0]的地址,地址都是4/8
printf("%d\n",sizeof(&a[0]+1));
//&a[0]是a[0]的地址,地址+1跳过地址类型长度
//得到的是a[1]的地址,但还是地址,4/8

 第二组

//字符数组
char arr[] = {'a','b','c','d','e','f'};

printf("%d\n", sizeof(arr));
//sizeof(数组名)统计的是数组的大小,单位是字节,6
printf("%d\n", sizeof(arr+0));
//sizeof(arr+0)不属于这篇博客最开始说的两种情况,
//因此arr表示数组首元素地址,arr+0还是数组首元素地址,4/8
printf("%d\n", sizeof(*arr));
//arr表示数组首元素地址,*arr表示对数组首元素地址解引用
//求的是数组首元素大小 大小是1个字节
printf("%d\n", sizeof(arr[1]));
//计算arr[1]的大小,大小也是1个字节
printf("%d\n", sizeof(&arr));
//&arr表示数组的地址,为char(*)[6]类型,
//数组地址也是地址,4/8
printf("%d\n", sizeof(&arr+1));
//&arr表示数组的地址,&arr+1表示跳过1个数组大小的下一个数组的地址
//地址大小就是4/8
printf("%d\n", sizeof(&arr[0]+1));
//&arr[0]表示arr中第一个元素的地址,再+1表示arr[1]的地址,4/8
printf("%d\n", strlen(arr));
//strlen统计的是\0之前的字符个数,因为字符数组arr中没有\0,
//所以在求字符串长度的时候,会一直往后找,产生的结果就是随机值
printf("%d\n", strlen(arr+0));
//arr+0表示数组首元素地址,和第一个一样,也是随机值
printf("%d\n", strlen(*arr));
//*arr表示'a',其ASCII码值为97,strlen函数参数需要传一个地址
//当我们传递的是'a'时,'a'的ASCII码值就是97,那就是将97作为地址传参
//strlen就会从97这个地址开始统计字符串的长度,这就是非法访问了err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));
//&arr表示的数组的地址,数组的地址和数组首元素地址,值是一样的
//传给strlen后,依然是从第一个元素开始找\0,
//所以仍然是随机值
printf("%d\n", strlen(&arr+1));//随机值
printf("%d\n", strlen(&arr[0]+1));
//第二的元素的地址,结果也是随机值

 第三组

char arr[] = "abcdef";

printf("%d\n", sizeof(arr));
//sizeof(数组名)计算的是数组的大小,单位是字节,大小是7个字节
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));//char (*)[6],4/8
printf("%d\n", sizeof(&arr+1));//4/8
printf("%d\n", sizeof(&arr[0]+1));//4/8
printf("%d\n", strlen(arr));//6
printf("%d\n", strlen(arr+0));//6
printf("%d\n", strlen(*arr));//err
printf("%d\n", strlen(arr[1]));//err
printf("%d\n", strlen(&arr));//6
printf("%d\n", strlen(&arr+1));//随机值
printf("%d\n", strlen(&arr[0]+1));//5

 第四组

char *p = "abcdef";

printf("%d\n", sizeof(p));
//p是char* 类型的指针,大小4/8个字节
printf("%d\n", sizeof(p+1));
//p+1指向b,仍然是地址,大小4/8
printf("%d\n", sizeof(*p));//1
printf("%d\n", sizeof(p[0]));//1
printf("%d\n", sizeof(&p));//&p表示字符指针p的地址,大小是4/8个字节
printf("%d\n", sizeof(&p+1));//4/8
printf("%d\n", sizeof(&p[0]+1));//4/8
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
printf("%d\n", strlen(*p));//err
printf("%d\n", strlen(p[0]));//err
printf("%d\n", strlen(&p));//随机值
printf("%d\n", strlen(&p+1));//随机值
printf("%d\n", strlen(&p[0]+1));//5

 第五组

//二维数组
int a[3][4] = {0};

printf("%d\n",sizeof(a));//48
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));
//a[0]表示二维数组第一行的数组名,sizeof(数组名)j计算的是数组的大小,为16个字节
printf("%d\n",sizeof(a[0]+1));
//arr[0]是数组名,没有单独放在sizeof内部,没有&,
//数组名表示数组首元素地址,也就是a[0][0]的地址,+1表示arr[0][1]的地址
//4/8
printf("%d\n",sizeof(*(a[0]+1)));//4
printf("%d\n",sizeof(a+1));//4/8
//a是数组首元素的地址,是第一行的地址,int(*)[4]
//a+1就是第二行的地址
printf("%d\n",sizeof(*(a+1)));//16
//*(a+1)-->a[1]-->sizeof(*(a+1))-->sizeof(a[1])计算的第二行的大小
//a+1是第二行的地址,int(*)[4]
//*(a+1)访问第二行的值
printf("%d\n",sizeof(&a[0]+1));//4/8
//&a[0]是第一行地址 int(*)[4]
//&a[0]+1是第二行的地址
printf("%d\n",sizeof(*(&a[0]+1)));//16
//计算的是第二行的大小
printf("%d\n",sizeof(*a));//16
//计算的是第一行的大小
//a是数组首元素的地址,就是第一行的地址
//*a就是第一行的数组名
//*a --> *(a+0) --> a[0]
printf("%d\n",sizeof(a[3]));
//a[3]--> int [4]
//16

指针笔试题

笔试题1

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

 笔试题2

//由于还没学习结构体,这里告知结构体的大小是20个字节
struct Test
{
	int Num;
	char* pcName;
	short sDate;
	char cha[2];
	short sBa[4];
}*p;
//假设p 的值为0x100000。 如下表表达式的值分别为多少?
//已知,结构体Test类型的变量大小是20个字节
int main()
{
	printf("%p\n", p + 0x1);
	printf("%p\n", (unsigned long)p + 0x1);
	printf("%p\n", (unsigned int*)p + 0x1);
	return 0;
}

第一个:p为结构体类型的指针,p+1跳过一个结构体类型,结构体大小是20个字节,所以0x100000+20 == 0x100014

第二个:把p转换为unsigned long,p就是无符号整形了,这时p+1表示真正加1,0x100001

第三个:把p强制转换成unsigned int*类型,p+1跳过unsigned int类型大小的字节,即+4,0x100004

00000014
00000001
00000004

笔试题3

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,2000000 

笔试题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;
}

 特别注意:这道题数组初始化的时候是(  ,),这是逗号表达式(0,1)的结果是1,以此类推

1

笔试题5 

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;
}

&p[4][2] - &a[4][2]:指针-指针计算的是指针之间元素的个数(-4)

//10000000000000000000000000000100

//1111111111111111111111111111111111011

//1111111111111111111111111111111111100---以%p的形式打印出来FFFFFFFC

//以%d形式打印出来的是补码,因此是-4

FFFFFFFC, -4

笔试题6

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

笔试题7

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

at

 笔试题8

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

 指针阶段到此结束,完结撒花!

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

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

相关文章

Wazuh部署之单节点部署

Linux进行Wazuh单机部署 1. Wazuh索引器安装2. Wazuh服务器安装3. Wazuh仪表盘安装4. 踩坑记录 1. Wazuh索引器安装 1.1 证书创建 生成SSL证书 下载wazuh-certs-tool.sh脚本和config.yml配置文件。这将创建证书&#xff0c;对Wazuh中心组件之间的通信进行加密。 curl -sO h…

MySQL高阶查询语句

目录 一、常用查询 1、按关键字排序 1.1 升序排序 1.2 降序排序 1.3 结合where进项条件过滤再排序 1.4 多条件排序 2、区间判断及查询不重复记录 2.1 and/or&#xff08;且/或&#xff09; 2.2 嵌套 /多条件 2.3 distinct 查询不重复记录 3、对结果进行分组 4、限…

基于YOLOV8模型和CCPD数据集的车牌目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOV8模型和CCPD数据集的车牌目标检测系统可用于日常生活中检测与定位车牌目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算…

Day51|leetcode 309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费

leetcode 309.最佳买卖股票时机含冷冻期 题目链接&#xff1a;309. 买卖股票的最佳时机含冷冻期 - 力扣&#xff08;LeetCode&#xff09; 视频链接&#xff1a;动态规划来决定最佳时机&#xff0c;这次有冷冻期&#xff01;| LeetCode&#xff1a;309.买卖股票的最佳时机含冷冻…

对比通达信主副图指标,排序指标的显示方式

**1.新建指标的注意事项&#xff1a;**打开指标公式编辑器&#xff0c;公式名称是要必填的、指标源码里面有参数要带上参数&#xff0c;不然会指报错、画线方法&#xff08;主图显示&#xff0c;还是幅图显示&#xff0c;以及是否要叠加k线&#xff0c;主图替换等等&#xff09…

七大基本判断问题,你都get到了吗

Hello,这里是mouche&#xff0c;当然你也可以叫我某车&#xff0c;反正大家都爱这么叫&#x1f601;最近看到一些判断就想记下来&#xff0c;这一篇算附带自己的思考和整理的整理型的博客吧&#xff0c;接下去如果有想到新的也会在这一篇进行整理如果有错误的可以在评论区提醒我…

圆圈加数字的css

方式一 .circle { width: 50px; height: 50px; border-radius: 50%; background-color: #f00; color: #fff; text-align: center; line-height: 50px; } .circle::before { content: attr(data-number); display: block; } <div class"circle" data-number"…

Hibernate(Spring Data)抓取策略

文章目录 示例代码放到最后&#xff0c;使用的是Springboot 项目1. 简介2. Hibernate抓取策略分类2.1 即时加载&#xff08;Eager Loading&#xff09;2.2 延迟加载&#xff08;Lazy Loading&#xff09;2.3 子查询加载&#xff08;Subselect Loading&#xff09;2.4 基于批处理…

【100天精通python】Day48:python Web开发_WSGI接口与使用

目录 1 WSGI接口 1.1 CGI 简介 1.2 WSGI 简介 1.3 定义 WSGI 接口 1.3.1 应用程序&#xff08;Application&#xff09; 1.3.2 服务器&#xff08;Server&#xff09; 1.4 WSGI 接口的使用示例 1.5 WSGI接口的优势 1 WSGI接口 上一节实现了静态服务器&#xff0c;但是当…

Cell子刊:肠道菌菌株之间的“明争暗斗”

抗生素耐药性质粒可以在肠道中不同肠杆菌科之间传播。本期经典文献解读&#xff0c;为大家带来发表在Cell Host and Microbe上的研究成果&#xff0c;探索具有相似营养需求的肠杆菌科沙门氏菌群如何在同一肠道中共同繁殖及质粒转移。 期刊&#xff1a;Cell Host Microbe …

八、MySQL(DML)如何修改表中的数据?

1、修改表数据 &#xff08;1&#xff09;基础语法&#xff1a; update 表名 SET 字段名1数值1,字段名2数值2&#xff0c;…… [where 条件]; &#xff08;2&#xff09; 操作实例&#xff1a; 第一步&#xff1a; 先准备一张表 insert into things values (10086,18,0x12…

spark支持深度学习批量推理

背景 在数据量较大的业务场景中&#xff0c;spark在数据处理、传统机器学习训练、 深度学习相关业务&#xff0c;能取得较明显的效率提升。 本篇围绕spark大数据背景下的推理&#xff0c;介绍一些优雅的使用方式。 spark适用场景 大数据量自定义方法处理、类sql处理传统机器…

掌握Kubernetes API:释放容器编排的潜力

Kubernetes API使用 1、 API是什么&#xff1f; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;&#xff1a; 是一些预先定义的接口&#xff08;如函数、HTTP接口&#xff09;&#xff0c;或指软件系统不同组成部分衔接的约定。 用来…

分类算法系列③:模型选择与调优 (Facebook签到位置预测)

目录 模型选择与调优 1、介绍 模型选择&#xff08;Model Selection&#xff09;&#xff1a; 调优&#xff08;Hyperparameter Tuning&#xff09;&#xff1a; 本章重点 2、交叉验证 介绍 为什么需要交叉验证 数据处理 3、⭐超参数搜索-网格搜索(Grid Search) 介绍…

合宙Air724UG LuatOS-Air LVGL API控件--图表 (Chart)

图表 (Chart) 一幅图胜过一千个字&#xff0c;通过图表展示出的数据内容能让用户更快速有效的了解数据特征。 代码示例 – 创建图表 chart lvgl.chart_create(lvgl.scr_act(), nil) lvgl.obj_set_size(chart, 200, 150) lvgl.obj_align(chart, nil, lvgl.ALIGN_CENTER, 0, …

聊聊Http服务化改造实践

在微服务架构体系中远程RPC调用主要包括Dubbo与Http调用两个大类&#xff0c;由于Dubbo拥有服务注册中心&#xff0c;并且起服务的命名非常规范&#xff0c;使用包名.类名.方法名进行描述。 而http调用通常都是使用httpclient等相关类库&#xff0c;这些在使用上并没有问题&am…

常见问题。

警告&#xff1a;There are 2 audio listeners in the scene. Please ensure there is always exactly one audio listener in the scene. 解决&#xff1a;两个摄像机两个audio listeners组件&#xff0c;禁用一个就好了。 错误&#xff1a;Scene ‘xxxxx’ couldn’t be loa…

在 Amazon 搭建无代码可视化的数据分析和建模平台

现代企业常常会有利用数据分析和机器学习帮助解决业务痛点的需求。如制造业中&#xff0c;利用设备采集上来的数据做预测性维护&#xff0c;质量控制&#xff1b;在零售业中&#xff0c;利用客户端端采集的数据做渠道转化率分析&#xff0c;个性化推荐等。 亚马逊云科技开发者…

能直接运营的发接任务平台小程序搭建开发演示

有个项目估计做过互联网的小伙伴都听说过——发接任务平台。 基本每年都有发接任务平台关站&#xff0c;但又有新的平台出来&#xff0c;往复循环&#xff0c;无比热闹。这在互联网圈不常见&#xff0c;互联网项目很多都是风头过去了就结束了&#xff0c;但发接任务年年似乎都…

HTML 播放器效果

效果图 实现代码 <!DOCTYPE HTML> <html><head><title>爱看动漫社区 | 首页 </title><link href"css/bootstrap.css" relstylesheet typetext/css /><!-- jQuery --><script src"js/jquery-1.11.0.min.js"…