指针与数组笔试题解析

news2025/2/21 17:16:34

文章目录

  • 1.一维数组
    • 1.1 整型数组
    • 1.2 字符数组
  • 2. 二维数组
  • 3.指针笔试题
    • 3.1 练习1
    • 3.2 练习2
    • 3.3 练习3

数组名的意义:

1.sizeof(数组名),这里的数组表示整个数组,计算的整个数组的大小
2.&数组名,这里的数组名表示整个数组的,取出的是整个数组的地址
3.除此之外所有的数组名都是表示首元素的地址。

1.一维数组

1.1 整型数组

int main()
{
	int a[] = {1,2,3,4};
	printf("%d\n",sizeof(a));//16,sizeof单独加上数组名计算的是整个数组的大小
	printf("%d\n",sizeof(a+0));//4或者8,这里数组名不是单独在sizeof内,所以会变成数组首元素的地址,而指针的大小根据选择的是32位还是64位而不同。
	printf("%d\n",sizeof(*a));//4,a是首元素的地址,被解引用后就是首元素。整型为4个字节大小
	printf("%d\n",sizeof(a+1));// 4/8,表示数组第二个元素的地址
	printf("%d\n",sizeof(a[1]));//4,表示数组第一个元素是整型
	printf("%d\n",sizeof(&a));// 4/8,&数组名拿到是整个数组的地址,而整个数组的地址也是指针,所以大小还是4或者8
	printf("%d\n",sizeof(*&a));//16,取地址和解引用相互抵消,使得本质上是sizeof(a)
	printf("%d\n",sizeof(&a[0]));//4/8,计算的数组首元素的地址,也就是指针
	printf("%d\n",sizeof(&a[0]+1));//4/8,计算的是数组第二个元素的地址,也就是指针
	return 0;
}
//打印结果
/*
16
8
4
8
4
8
16
8
8
*/

1.2 字符数组

#include <stdio.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n",sizeof(arr));
	printf("%d\n",sizeof(arr+1));
	printf("%d\n",sizeof(arr+0));
	printf("%d\n",sizeof(*arr));
	printf("%d\n",sizeof(arr[1]));
	printf("%d\n",sizeof(&arr));
	printf("%d\n",sizeof(&arr+1));
	printf("%d\n",sizeof(&arr[0]+1));
	return 0;
	//与上面解释类似
}
//打印结果:
/*
6
8
8
1
1
8
8
8
*/
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = {'a','b','c','d','e','f'};
	printf("%d\n",strlen(arr));//随机值,表示的是从数组的首元素开始计算直到碰到'\0'为止的长度
	printf("%d\n",strlen(arr+0));//随机值,表示的是从数组的首元素开始计算直到碰到'\0'为止的长度
	printf("%d\n",strlen(*arr));//错误写法,strlen函数参数要传地址
	printf("%d\n",strlen(arr[1]));//错误写法,strlen函数参数要传地址
	printf("%d\n",strlen(&arr));/*随机值,虽然&arr表示的是整个数组的地址,但是整个数组的地
	址依旧是用数组首元素的地址代表。表示的是从数组的首元素开始计算直到碰到'\0'为止的长度*/
	printf("%d\n",strlen(&arr+1));//随机值,表示的是从数组的最后一个元素后的地址开始计算直到碰到'\0'为止的长度。会比第一个随机值数少6个字节
	printf("%d\n",strlen(&arr[0]+1));//随机值,表示从数组第二个元素地址开始计算直到碰到'\0'为止的长度。会比第一个随机值数少1个字节
	
	return 0;
}
//打印结果:
/*(注释掉错误写法后)
42
42
42
36
41
*/
#include <stdio.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n",sizeof(arr));
	printf("%d\n",sizeof(arr+1));
	printf("%d\n",sizeof(arr+0));
	printf("%d\n",sizeof(*arr));
	printf("%d\n",sizeof(arr[1]));
	printf("%d\n",sizeof(&arr));
	printf("%d\n",sizeof(&arr+1));
	printf("%d\n",sizeof(&arr[0]+1));
	//整体解释和第一道题类型,不过要注意的是sizeof会计算隐藏的'\0'的大小。
	return 0;
}
//打印结果:
/*
7
8
8
1
1
8
8
8
*/
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	printf("%d\n",strlen(arr));//6,该数组arr最后隐藏了一个'\0',strlen计算到'\0'为止
	printf("%d\n",strlen(arr+0));//6,该数组arr最后隐藏了一个'\0',strlen计算到'\0'为止
	printf("%d\n",strlen(*arr));//错误写法,strlen函数参数要传地址
	printf("%d\n",strlen(arr[1]));//错误写法,strlen函数参数要传地址
	printf("%d\n",strlen(&arr));//6,&arr虽然表示整个数组的地址,但是地址是用数组首元素地址来代表的。
	printf("%d\n",strlen(&arr+1));//随机值,&arr表示整个数组的地址,+1跳过整个数组,也跳过了'\0',直到找到后面的'\0'才会停止
	printf("%d\n",strlen(&arr[0]+1));//5,表示从数组的第二的元素地址开始往后计算长度。	
	return 0;
}
//打印结果
/*(注释掉错误写法后)
6
6
6
26
5
*/
#include <stdio.h>
int main()
{
	char* arr = "abcdef";
	printf("%d\n",sizeof(arr));//4/8,这里的arr不能等同于数组,arr就是指针,这个指针指向了"abcdef"这个常量字符串
	printf("%d\n",sizeof(arr+1));//4/8,arr+1就表示该常量字符串第二个元素的地址
	printf("%d\n",sizeof(*arr));//1,对指针解引用得到的就是首元素'a',类型char大小为1字节。
	printf("%d\n",sizeof(arr[0]));//1,arr[0]数组首元素'a'
	printf("%d\n",sizeof(&arr));//4/8,&arr表示arr的地址也就是一个二级指针
	printf("%d\n",sizeof(&arr+1));//4/8,&arr+1也是二级指针,
	printf("%d\n",sizeof(&arr[0]+1));//4/8,表示第二个元素'b'的地址
	return 0;
}
//打印结果:
/*
8
8
1
1
8
8
8
*/
#include <stdio.h>
#include <string.h>
int main()
{
	char* arr = "abcdef";
	printf("%d\n",strlen(arr));//6,arr存放的就是首元素的地址
	printf("%d\n",strlen(arr+1));//5,传入第二个元素的地址
	printf("%d\n",strlen(*arr));//错误写法,strlne必须传地址进去
	printf("%d\n",strlen(arr[0]));//错误写法,strlne必须传地址进去
	printf("%d\n",strlen(&arr));//随机值,&arr是首元素'a'地址的地址,是一个二级指针,会一直找到下一个'\0'为止。
	printf("%d\n",strlen(&arr+1));//随机值,是一个二级指针(不一定在&arr后面),会一直找到下一个'\0'为止。
	printf("%d\n",strlen(&arr[0]+1));//5,传入第二个元素的地址
	return 0;
}
//打印结果:
/*(注释掉错误写法后)
6
5
3
11
5
*/

2. 二维数组

#include <stdio.h>
int main()
{
	int a[3][4] = {0};
	printf("%d\n",sizeof(a));//48,sizeof(数组名)计算的整个数组的大小
	printf("%d\n",sizeof(a[0][0]));//4,a[0][0]就是首元素
	printf("%d\n",sizeof(a[0]));//16,a[0]是第一行这个一维数组的数组名
	//数组名算是单独放在sizeof内部了,计算的是整个数组的大小,大小是16个字节
	printf("%d\n",sizeof(a[0]+1));//4/8,a[0]是第一行数组名,+1就不算单独放到sizeof中了。
	printf("%d\n",sizeof(*(a[0]+1)));//4,相当于a[0][1],拿到了数组第1行第2列的元素
	printf("%d\n",sizeof(a+1));// 4/8,数组名除俩个的特殊情况外都是数组首元素的地址,
	//这里加1拿到就是第二行的地址,是指针
	printf("%d\n",sizeof(*(a+1)));//16,相当于a[1],计算的第二行的大小
	printf("%d\n",sizeof(&a[0]+1));//4/8,&a[0]+1,a[0]相当于第一行的数组名,&a[0]就是第一行数组的地址,加1跳过第一行,就是第二行数组的地址,是指针。
	printf("%d\n",sizeof(*(&a[0]+1)));//16,计算的是第二行的大小,&a[0]拿到第一行的地址,然后+1拿到第2行的地址,再解引用拿到就是第二行了。
	printf("%d\n",sizeof(*a));//16,a表示的一行的地址,*a就是拿到第一行,
	printf("%d\n",sizeof(a[3]));//16,虽然数组越界了但是,在sizeof的执行过程中是不会使用a[3]的,sizof(a[3])会把a[3]理解为第4行的数组名,
	return 0;
}
//打印结果:
/*
48
4
16
8
4
8
16
8
16
16
16
*/

3.指针笔试题

3.1 练习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
/*
解释:&a拿到的是整个数组的地址,加1后跳过整个数组来到数组最后一个元素后面。也就说明了ptr的指向的地址再5的地址的后面,然后强制类型转换成整型指针,而整型指针-1只会前移动4个字节,ptr会指向5的地址。而a是数组名,表示数组首元素的地址,+1后就来到了第二个元素的地址。
*/

指针的指向

3.2 练习2

#include <stdio.h>
//这个结构体的大小是20个字节
struct test
{
	int Num;
	char* pcname;
	short sdata;
	char cha[2];
	short sba[4];
}*p = (struct Test*)0x100000;
//假设p的值为0x100000.
//已知test结构体的大小是20个字节
int main()
{
	printf("%p\n",p+0x1);
	printf("%p\n",(unsigned long)p+0x1);
	printf("%p\n",(unsigned long*)p+0x1);
	return 0;
}
//打印结果:
/*
00100014
00100001
00100004
*/
/*
解释:这里p指向的地址是0x100000。0x1就是1的16进制表达。p加1,因为p指向类型是struct test,类型大小20个字节,加1后也会跳过20这个字节(转换成16进制就是14).
后面p指针被强制类型转换成了一个无符号长整形的变量,这个类型不是指针变量,加1就是整数加1.
最后一个强制类型转换成了一个无符号长整形指针变量,是指针,然后无符号长整形的大小是4个字节,加1也就是跳过4个字节。
*/

3.3 练习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);//%x为16进制打印
	return 0;
}
//打印结果:4,2000000
/*
解释放下面
*/

ptr1:&a+1表示的跳过这个数组后的地址,也就是4后面的地址,然后被强制类型转换为了int*
ptr2:a是数组首元素的地址,都是被强制类型转换为了整型,然后+1,因为是整型加1就是数字加1.然后又被强制类型转换成了int*。
此时的指向如图所示
指针的指向
因为元素在系统当中是小端存储的,
1会被存储为:01 00 00 00
此时ptr2指向的就是01后面00的位置。
我们又知道数组中1的后面是2。
小端存储就是 01 00 00 00 02 00 00 00
ptr2被强制类型转换为了int*,解引用会一次取出4个字节,取出的就是00 00 00 02,将顺序反转成正常顺序就是02000000,打印时省略掉了第一个0变成了200000
ptr1[-1]的意思就是*(prt1-1).就拿出来4.

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

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

相关文章

【Diffusion学习】【生成式AI】Stable Diffusion、DALL-E、Imagen 背後共同的套路

文章目录 图片生成Framework 需要3个组件&#xff1a;相关论文【Stable Diffusion&#xff0c;DALL-E&#xff0c;Imagen】 具体介绍三个组件1. Text encoder介绍【结论&#xff1a;文字的encoder重要&#xff0c;Diffusion的模型不是很重要&#xff01;】评估指标&#xff1a;…

用go实现限流算法

文章目录 固定窗口优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 滑动窗口优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 漏桶限流器优缺点&#xff1a;适用场景&#xff1a;总结&#xff1a; 令牌桶优缺点&#xff1a;适用场景&#xff1a;总结&#xf…

定义损失函数并以此训练和评估模型

基础神经网络模型搭建 【Pytorch】数据集的加载和处理&#xff08;一&#xff09; 【Pytorch】数据集的加载和处理&#xff08;二&#xff09; 损失函数计算模型输出和目标之间的距离。通过torch.nn 包可以定义一个负对数似然损失函数&#xff0c;负对数似然损失对于训练具有多…

炎炎夏日,这份锂电AGV叉车保养指南赶紧收藏!

AGV 随着工厂自动化、计算机集成制造系统技术的逐步发展以及柔性制造系统、自动化立体仓库的广泛应用&#xff0c;AGV(Automatic GuidedVehicle)即自动导引车作为联系和调节离散型物流系统以使其作业连续化的必要的自动化搬运装卸手段&#xff0c;其应用范围和技术水平得到了迅…

云服务器实际内存与购买不足量问题

君衍 一、本篇缘由二、问题研究1、dmidecode2、dmesg | grep -i memory 三、kdump四、解决方案1、卸载kdump-tools2、清理依赖包3、修改配置文件4、重新生成配置文件5、重启服务器6、再次查看 一、本篇缘由 本篇由于最近买了云服务器&#xff0c;之前基本在本地使用VMware进行虚…

初识单片机之点亮LED灯

1、前言 如果说编程的开始是Hello world,那么单片机的开始就是点亮LED灯&#xff0c;这个操作最直接的展示了单片机强大的控制功能&#xff0c;这里我就以直接点亮指定位置的LED灯的形式演示这个功能。 2、原理介绍 我的单片机的LED灯都是接在单片机的P1口&#xff0c;从P10~P…

【数据结构(邓俊辉)学习笔记】高级搜索树02——B树

文章目录 1. 大数据1.1 640 KB1.2 越来越大的数据1.3 越来越小的内存1.4 一秒与一天1.5 分级I/O1.6 1B 1KB 2. 结构2.1 观察体验2.2 多路平衡2.3 还是I/O2.4 深度统一2.5 阶次含义2.6 紧凑表示2.7 BTNode2.8 BTree 3. 查找3.1 算法过程3.2 操作实例3.3 算法实现3.4 主次成本3.…

YOLOv8白皮书-第Y8周:yolov8.yaml文件解读

本文为365天深度学习训练营中的学习记录博客 原作者&#xff1a;K同学啊|接辅导、项目定制 请根据YOLOv8n、YOLOv8s模型的结构输出&#xff0c;手写出YOLOv8l的模型输出 文件位置&#xff1a;./ultralytics/cfg/models/v8/yolov8.yaml 一、参数配置 # Parameters nc: 80 # n…

Bug:时间字段显示有问题

Bug&#xff1a;时间字段显示有问题 文章目录 Bug&#xff1a;时间字段显示有问题1、问题2、解决方法一&#xff1a;添加注解3、解决方法二&#xff1a;消息转换器自定义对象映射器配置消息转换器 1、问题 ​ 在后端传输时间给前端的时候&#xff0c;发现前端的时间显示有问题…

设计模式总结(设计模式的原则及分类)

1.什么是设计模式&#xff1f; 设计模式(Design pattern)代表了最佳的实践&#xff0c;通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结…

自动化任务调度,轻松管理海量数据采集项目

摘要&#xff1a; 本文深入探讨了在数据驱动时代&#xff0c;如何通过自动化任务调度轻松驾驭海量数据采集项目&#xff0c;提升工作效率&#xff0c;确保数据处理的准确性和及时性。我们分享了一系列实用策略与工具推荐&#xff0c;帮助企业和开发者优化数据采集流程&#xf…

SQL 中的 EXISTS 子句:探究其用途与应用

目录 EXISTS 子句简介语法 EXISTS 与 NOT EXISTSEXISTS 子句的工作原理实际应用场景场景一&#xff1a;筛选存在关联数据的记录场景二&#xff1a;优化查询性能 EXISTS 与其他 SQL 结构的比较EXISTS vs. JOINEXISTS vs. IN 多重 EXISTS 条件在 UPDATE 语句中使用 EXISTS常见问题…

基于 AntV F2 的雷达图组件开发

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 AntV F2 的雷达图组件开发 应用场景介绍 雷达图是一种多变量统计图表&#xff0c;用于可视化展示多个维度的数据。它通常用于比较不同对象的多个属性或指标&#xff0c;直观地反映各维度之间的差异和整体…

LoRaWAN协议

目录 一、介绍 1、LPWA是什么&#xff1f; 2、LoRa是什么&#xff1f; 3、LoRaWAN是什么&#xff1f; 4、浅谈LoRa与LoRaWAN的区别 5、LoRaWAN开发背景 6、LoRaWAN与NB-IOT如何选择&#xff1f; 二、LoRaWAN网络结构 1、组网结构 2、星型拓扑结构 三、数据格式 1、…

golang AST语法树解析

1. 源码示例 package mainimport ("context" )// Foo 结构体 type Foo struct {i int }// Bar 接口 type Bar interface {Do(ctx context.Context) error }// main方法 func main() {a : 1 }2. Golang中的AST golang官方提供的几个包&#xff0c;可以帮助我们进行A…

代码随想录算法训练营第五十五天|101.孤岛的总面积、102.沉没孤岛、103.水流问题、104.建造最大岛屿

101.孤岛的总面积 题目链接&#xff1a;101.孤岛的总面积沉没孤岛 文档讲解&#xff1a;代码随想录 状态&#xff1a;不会 思路&#xff1a; 步骤1&#xff1a;将边界上的陆地变为海洋 步骤2&#xff1a;计算孤岛的总面积 题解&#xff1a; public class Main {// 保存四个方…

【UE5.1】NPC人工智能——02 NPC移动到指定位置

效果 步骤 1. 新建一个蓝图&#xff0c;父类选择“AI控制器” 这里命名为“BP_NPC_AIController”&#xff0c;表示专门用于控制NPC的AI控制器 2. 找到我们之前创建的所有NPC的父类“BP_NPC” 打开“BP_NPC”&#xff0c;在类默认值中&#xff0c;将“AI控制器类”一项设置为“…

动手学深度学习——3.多层感知机

1.线性模型 线性模型可能出错 例如&#xff0c;线性意味着单调假设&#xff1a; 任何特征的增大都会导致模型输出的增大&#xff08;如果对应的权重为正&#xff09;&#xff0c; 或者导致模型输出的减小&#xff08;如果对应的权重为负&#xff09;。 有时这是有道理的。 例…

R绘制Venn图及其变换

我自己在用R做各种分析时有不少需要反复用到的基础功能&#xff0c;比如一些简单的统计呀&#xff0c;画一些简单的图等等&#xff0c;虽说具体实现的代码也不麻烦&#xff0c;但还是不太想每次用的时候去找之前的代码。 索性将常用的各种函数整成了一个包&#xff1a;pcutils…

前端JS特效第34集:jQuery俩张图片局部放大预览插件

jQuery俩张图片局部放大预览插件&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta http-equiv"X-UA-Co…