当前位置: 首页 > news >正文

指针和数组笔试题讲解(2)

🐵本篇文章将会对上篇一维数组笔试题的剩余部分和二维数组的笔试题进行讲解

一、一维数组

1>试题部分(一)✏️

    char* p = "abcdef";printf("%zd\n", sizeof(p)); printf("%zd\n", sizeof(p + 1)); printf("%zd\n", sizeof(*p));printf("%zd\n", sizeof(p[0]));printf("%zd\n", sizeof(&p));printf("%zd\n", sizeof(&p + 1));printf("%zd\n", sizeof(&p[0] + 1));

2>讲解部分📗

 printf("%zd\n", sizeof(p));

【讲解】p是一个字符指针,字符指针在接收字符串时,是将字符串的首地址传给指针,在这里就是将'a'的地址传给p,sizeof(p)就是求'a'的地址,那答案就是4/8个字节


printf("%zd\n", sizeof(p + 1));

【讲解】p是字符'a'的地址,+1后跳过一个字节,指向下一个元素'b',此时p+1就是'b'的地址,答案为4/8个字节


printf("%zd\n", sizeof(*p));
printf("%zd\n", sizeof(p[0]));

【讲解】p为数组首元素'a'的地址,对其解引用后,就是'a',p[0]也是'a',字符'a'的大小为1个字节


 printf("%zd\n", sizeof(&p));

 printf("%zd\n", sizeof(&p + 1));

【讲解】当我们定义一个指针,系统就会为其开辟内存空间,那么这块内存空间的编号就是地址,地址的大小为4/8个字节


 printf("%zd\n", sizeof(&p[0] + 1));

【讲解】&p[0]为'a'的地址,+1后为'b'的地址,所以大小为4/8个字节

3>打印结果📑

以下是在x64环境下运行的结果

1>试题部分(二)✏️

    char *p = "abcdef";printf("%d\n", strlen(p));printf("%d\n", strlen(p + 1));printf("%d\n", strlen(*p));printf("%d\n", strlen(p[0]));printf("%d\n", strlen(&p)); printf("%d\n", strlen(&p + 1));printf("%d\n", strlen(&p[0] + 1));

2>讲解部分📘

printf("%d\n", strlen(p));

【讲解】strlen函数用来计算字符串长度,它会从接收到的地址的位置依次向后读取直到遇到'\0'结束,这里将字符串的首地址:'a'的地址传给了strlen函数,因此它会从'a'的地址处依次向后读取,直到遇到'\0',所以其答案为6个字节


 printf("%d\n", strlen(p + 1));

【讲解】这里strlen从'b'的地址处依次向后读取,因此答案为5个字节


printf("%d\n", strlen(*p));
printf("%d\n", strlen(p[0]));

【讲解】strlen函数接收的是地址,而这里是将'a'的ASCII码值传给了strlen,但是strlen仍然会将其视为地址,那么在运行程序时就会报错


printf("%d\n", strlen(&p)); 
printf("%d\n", strlen(&p + 1));

【讲解】在从下图&p或者&p + 1的位置向后读取时,不知道什么时候会出现'\0',随意答案为随机值


 printf("%d\n", strlen(&p[0] + 1));

【讲解】&p[0]为'a'的地址,+1后为'b'的地址,从该地址依次向后读取,答案为5个字节

3>打印结果📑

以下是在x64环境下运行的结果(已将会报错的代码注释)

二、二维数组

1>试题部分✏️

    int a[3][4] = { 0 };printf("%zd\n", sizeof(a));printf("%zd\n", sizeof(a[0][0]));printf("%zd\n", sizeof(a[0]));printf("%zd\n", sizeof(a[0] + 1));printf("%zd\n", sizeof(*(a[0] + 1)));printf("%zd\n", sizeof(a + 1));printf("%zd\n", sizeof(*(a + 1)));printf("%zd\n", sizeof(&a[0] + 1));printf("%zd\n", sizeof(*(&a[0] + 1)));printf("%zd\n", sizeof(*a));printf("%zd\n", sizeof(a[3]));

2>讲解部分📙

printf("%zd\n", sizeof(a));

【讲解】a是二维数组的数组名,数组名单独放在sizeof中,就是求整个数组的大小,所以答案为12*4 = 48个字节


 printf("%zd\n", sizeof(a[0][0]));

【讲解】求第一行第一个元素的大小,答案为4个字节


 printf("%zd\n", sizeof(a[0]));

【讲解】在二维数组中,a[0]就是二维数组的第一行一维数组的数组名,数组名单独放在sizeof中,就是求第一行一维数组的大小,答案为16个字节

二维数组在计算机中的存储模式如下:


printf("%zd\n", sizeof(a[0] + 1));

printf("%zd\n", sizeof(*(a[0] + 1)));

【讲解】a[0]是第一行一维数组名,没有单独出现在sizeof里,所以就代表着一维数组首元素的地址,+1后就是第一行第二个元素的地址,解引用后就是第一行第二个元素,所以答案分别为4/8和4个字节


printf("%zd\n", sizeof(a + 1));
printf("%zd\n", sizeof(*(a + 1)));

【讲解】a为二维数组的数组名,代表数组首元素的地址也就是第一行的地址,+1后跳过一行变为第二行的地址,对第二行解引用后,就是求第二行的大小;

另一种分析:*(a + 1)就是a[1],a[1]就是第二行的数组名,将第二行的数组名单独放在sizeof中就是求第二行的大小,所以答案分别为4/8和16个字节


printf("%zd\n", sizeof(&a[0] + 1));
printf("%zd\n", sizeof(*(&a[0] + 1)));

【讲解】a[0是]第一行一维数组的数组名,取地址后,就是第一行的地址,+1后跳过一行也就是第二行的地址,对其解引用就是求第二行的大小,答案为4/816个字节


printf("%zd\n", sizeof(*a));

【讲解】a[0]是第一行的数组名,==> *(a + 0) ==>*a ;数组名单独放在sizeof中就是求第一行的大小,答案为16个字节


printf("%zd\n", sizeof(a[3]));

【讲解】首先并不会访问冲突,因为sizeof是根据类型判断大小的并不会真正去访问它,将他单独放在sizeof中和将a[0]单独放在sizeof中是一个效果,答案都是16个字节

3>打印结果📑

以下是在x64环境下运行的结果


🙉那么本次对一维数组和二维数组的笔试题全部讲解完毕,后续会对指针的笔试题进行讲解

http://www.lryc.cn/news/168977.html

相关文章:

  • MapReduce YARN 的部署
  • vue 引入zTree
  • 链队列的基本操作(带头结点,不带头结点)
  • 深入学习 Redis Cluster - 基于 Docker、DockerCompose 搭建 Redis 集群,处理故障、扩容方案
  • C现代方法(第3、4章)笔记
  • R语言绘制染色体变异位置分布图,RIdeogram包
  • Vue知识系列(7)每天10个小知识点
  • 5分钟就能实现的API监控,有什么理由不做呢?
  • Jmeter引入外部jar包以满足加密数据的Post请求
  • 了解冒泡排序
  • 群辉 Synology NAS Docker 安装 RustDesk-server 自建服务器只要一个容器
  • 为什么要有override
  • Linux界的老古董
  • 安卓逆向 - Xposed入门教程
  • 【嵌入式】2024届校招岗位汇总
  • Docker搭建ELK日志采集服务及Kibana可视化图表展示
  • SpringBoot结合MyBatis实现多数据源配置
  • 单个vue echarts页面
  • 【web开发】6、Django(1)
  • 第29节-PhotoShop基础课程-滤镜库
  • 空间(蓝桥杯)
  • 蓝桥杯2023年第十四届省赛真题-更小的数--题解
  • SpringBoot详解
  • typescript 类型断言
  • 如何确定自己是否适合做程序员?
  • LabVIEW以编程方式查找系统中DAQ设备的设备名称
  • 23、mysql数据库的安装
  • 【实战详解】如何快速搭建接口自动化测试框架?Python + Requests
  • Linux安全加固:保护你的服务器
  • 【C++初阶】C++STL详解(四)—— vector的模拟实现