面试题理解深层次的数组名

目录

引言 

一:一维数组

举例如下

1.铺垫知识 

数组名是数组首元素的地址,但是有两个特殊情况

(1)sizeof(数组名)

(2)&数组名

2.分析讲解上述代码结果

2.字符数组 

举例一如下

1.知识铺垫

2.分析结果

举例二如下 

举例三如下 

三:二维数组 

1.知识铺垫

举例如下

2.仔细分析讲解 

四:感谢观看 


听说看到日落金山的人,接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

引言 

关于数组名我们熟知的便是数组名是数组首元素的地址,但还有一些我们所不了解的小知识点,接下来通过面试题来了解各种各样的变化方式

一:一维数组

举例如下

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

仔细想想这些代码的结果为啥呢

1.铺垫知识 

数组名的理解:

数组名是数组首元素的地址,但是有两个特殊情况
(1)sizeof(数组名)

这里的数组名表示整个数组,计算的是整个数组的大小单位是字节

(2)&数组名

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

2.分析讲解上述代码结果
int a[] = {1,2,3,4};
printf("%d\n",sizeof(a));//4*4=16个字节
printf("%d\n",sizeof(a+0));//不是单独的数组名,数组名a是首元素的地址,a+0还是首元素的地址,地址的大小4/8个字节
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]));//第二个元素,大小为4个字节
printf("%d\n",sizeof(&a));//&a是数组的地址,地址为4/8个字节
printf("%d\n",sizeof(*&a));//*&a==a,同第一个为16个字节
printf("%d\n",sizeof(&a+1));//&a+1相对于&a是跳过了整个数组,但&a+1还是地址,大小为4/8个字节
printf("%d\n",sizeof(&a[0]));//首元素的地址,大小为4/8个字节
printf("%d\n",sizeof(&a[0]+1));//第二个元素的地址,大小为4/8个字节

2.字符数组 

举例一如下

char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));
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));
printf("%d\n", strlen(arr));
printf("%d\n", strlen(arr+0));
printf("%d\n", strlen(*arr));
printf("%d\n", strlen(arr[1]));
printf("%d\n", strlen(&arr));
printf("%d\n", strlen(&arr+1));
printf("%d\n", strlen(&arr[0]+1));
1.知识铺垫

字符串的结束标志是"\0"

strlen求取的字符串长度是"\0"之前的,不包括"\0"

sizeof()计算时会统计"\0"

2.分析结果
char arr[] = {'a','b','c','d','e','f'};
printf("%d\n", sizeof(arr));// 数组名单独放sizeof内部,这里的arr表示整个数组,计算的是整个数组的大小,为6个字节
printf("%d\n", sizeof(arr+0));//arr表示数组首元素的地址,arr+0还是数组首元素的地址,为4/8个字节
printf("%d\n", sizeof(*arr));//arr表示数组首元素的地址,*arr表示首元素。大小为一个字节
printf("%d\n", sizeof(arr[1]));//表示第二个元素,大小是一个字节
printf("%d\n", sizeof(&arr));//&arr是整个数组的地址,是地址就是4/8个字节
printf("%d\n", sizeof(&arr+1));//&arr+1是跳过整个数组后的地址,4/8个字节
printf("%d\n", sizeof(&arr[0]+1));//第二个元素的地址,4/8个字节
printf("%d\n", strlen(arr));//因为字符数组arr中没有"\0",所以在求取字符串长度时,会一直往后找,产生的结果就是随机值
printf("%d\n", strlen(arr+0));//arr+0是首元素的地址,和第一个一样,也是随机值
printf("%d\n", strlen(*arr));//错误,arr是数组首元素的地址,*arr就是首元素,就是‘a’--97
//strlen函数参数的部分需要传一个地址,当我们传递的是'a'时,‘a'的ASCII码是97,那就是将97作为地址传参,strlen就会从97这个地址开始统计字符串长度,这就是非法访问内存了
printf("%d\n", strlen(arr[1]));//同上是错误的
printf("%d\n", strlen(&arr));//&arr是数组的地址,数组的地址和数组首元素的地址,值是一样的,那么传递给strlen函数后,依然是从数组的第一个元素的位置开始往后统计,结果为随机值
printf("%d\n", strlen(&arr+1));//随机值
printf("%d\n", strlen(&arr[0]+1));//第二个元素的地址,结果也是随机值

举例二如下 

char arr[] = "abcdef";
printf("%d\n", sizeof(arr));//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));//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));//错误
printf("%d\n", strlen(arr[1]));//错误
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是指针变量,指向字符数组的首字符,大小为4/8个字节
printf("%d\n", sizeof(p+1));//p+1是'b'的地址,大小为4/8个字节
printf("%d\n", sizeof(*p));//*p就是'a',j就是1个字节
printf("%d\n", sizeof(p[0]));//同上1个字节
printf("%d\n", sizeof(&p));//4/8个字节,二级指针char **
printf("%d\n", sizeof(&p+1));//4/8个字节
printf("%d\n", sizeof(&p[0]+1));//’b'的地址,4/8个字节
printf("%d\n", strlen(p));//6
printf("%d\n", strlen(p+1));//5
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));//5

三:二维数组 

1.知识铺垫

二维数组的数组名表示首行元素的地址

举例如下

int a[3][4] = {0};
printf("%d\n",sizeof(a));
printf("%d\n",sizeof(a[0][0]));
printf("%d\n",sizeof(a[0]));
printf("%d\n",sizeof(a[0]+1));
printf("%d\n",sizeof(*(a[0]+1)));
printf("%d\n",sizeof(a+1));
printf("%d\n",sizeof(*(a+1)));
printf("%d\n",sizeof(&a[0]+1));
printf("%d\n",sizeof(*(&a[0]+1)));
printf("%d\n",sizeof(*a));
printf("%d\n",sizeof(a[3]));
2.仔细分析讲解 
int a[3][4] = {0};
printf("%d\n",sizeof(a));//单独的数组名,大小为3*4*4
printf("%d\n",sizeof(a[0][0]));//4
printf("%d\n",sizeof(a[0]));//a[0]是第一行这个一维数组的数组名,数组名单独放在sizeof内部,计算的是整个数组的大小,大小为4*4
printf("%d\n",sizeof(a[0]+1));//a[0]作为第一行的数组名,也是a[0][0]的地址没有单独放在sizeof内部,所以a[0]+1是a[0][1]的地址,大小为4/8个字节
printf("%d\n",sizeof(*(a[0]+1)));//a[0][1],大小为4
printf("%d\n",sizeof(a+1));//4/8
//a是数组首元素的地址,是第一行的地址int(*)[4]
//a+1是第二行的地址
printf("%d\n",sizeof(*(a+1)));//a[1],16
printf("%d\n",sizeof(&a[0]+1));//4/8
//&a[0]是第一行的地址 int (*)[4]
//&a[0]+1是第二行的地址 int (*)[4]
printf("%d\n",sizeof(*(&a[0]+1)));//16第二行的大小
printf("%d\n",sizeof(*a));//计算的是第一行的大小16
//a是数组首元素的地址,就是第一行的地址
//*a就是第一行a[0]
printf("%d\n",sizeof(a[3]));//16

四:感谢观看 

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

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

相关文章

(三)其他的输入输出

文章目录 getchar();单个字符输入使用: putchar();单个字符输出(自带换行)使用 puts();字符串输出与printf区别使用 gets();后面补充 代码现象 getchar(); 单个字符输入 使用: 变量 getchar(); 例:char a; a getchar(); put…

软件测试之单元测试、系统测试、集成测试知识总结

一、单元测试的概念 单元测试是对软件基本组成单元进行的测试,如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法,有可能对应多个程序文件中的一组函数。 单元也具有一些基本的属性。比如:明确的功能、规格定义&#…

PHP进阶-实现网站的QQ授权登录

授权登录是站点开发常见的应用场景,通过社交媒体一键授权可以跳过注册站点账户的繁琐操作。本文将讲解如何用PHP实现QQ授权登录。首先,我们需要申请QQ互联开发者账号获得APPID和密钥;接着,我们下载QQ官方SDK:PHP SDK v…

IP地址定位技术的应用及其重要性

随着网络技术的快速发展,网络安全问题日益凸显,IP地址定位技术在网络安全领域的应用也越来越广泛。本文将介绍IP地址定位技术在网络安全领域的应用及其重要性。 一、IP地址定位技术概述 IP地址定位技术是指通过一定的技术手段,将虚拟网络中的…

关于《码农翻身》一书的读后感以及自己的一些拙见汇总

书籍名称 《码农翻身》 | 刘欣(码农翻身) 著 | 文章将以问答的形式进行叙述 1.是从什么渠道接触到《码农翻身》的 一个工作日的下午,手上的任务基本结束,翻了翻桌上的书和笔记之类的,同事见我在看书,于是向…

阿里后端实习一面面经

阿里后端实习一面面经 项目中使用到了es,es的作用? elasticsearch是一款非常强大的开源搜索引擎,具备非常多强大功能,可以帮助我们从海量数据中快速找到需要的内容 es中的重要概念? 群集:一个或多个节点…

PostgreSQL的常见错误和解决方法

转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。 在学习新的东西时,会犯很多的错误,会遇到很多坑。我们在填坑与犯错中不断进步成长。 以下是在学习pgsql中…

Pytorch详细安装过程

1、安装anaconda 官网(https://www.anaconda.com/products/distribution#Downloads)下载,使用管理员身份运行(不使用似乎也没事) 这里选择Just me(至于为啥,咱也不是很清楚) 更改路…

编程基础 - 初识shell

编程基础 - 初识shell 返回序言及专栏目录 文章目录 编程基础 - 初识shell前言一、Linux的路径1、绝对路径2、相对路径3、特殊路径 二、交互式工作1、先联系上shell2、交互式命令 三、执行脚本四、sh和bash的区别总结 前言 shell是Linux内核外的一层壳,是用户与Li…

大数据 MapReduce如何让数据完成一次旅行?

专栏上一期我们聊到MapReduce编程模型将大数据计算过程切分为Map和Reduce两个阶段,先复习一下,在Map阶段为每个数据块分配一个Map计算任务,然后将所有map输出的Key进行合并,相同的Key及其对应的Value发送给同一个Reduce任务去处理…

数据库设计-DDL

D D L \huge{DDL} DDL DDL:数据库定义语言,用来定义数据对象(数据库、表) 简单操作 首先在cmd中进行操作,登录数据库 show databases; -- 以列表的形式显示所有的数据库create database [if not exists] 数据库名称…

[C#]使用DlibDotNet人脸检测人脸68特征点识别人脸5特征点识别人脸对齐人脸比对FaceMesh

【官方框架地址】 https://github.com/takuya-takeuchi/DlibDotNet 【算法介绍】 DlibDotNet是一个开源的.NET库,用于实现机器学习和计算机视觉应用。它基于C库dlib,通过C/CLI封装了dlib的所有功能,为.NET开发者提供了简单易用的API。以下是…

Nacos 持久化及集群的搭建【微服务】

文章目录 一、统一配置管理二、微服务配置拉取三、配置热更新四、多环境共享配置五、Nacos 集群搭建1. 集群结构2. 初始化数据库3. 搭建集群 六、Nginx 反向代理七、启动项目测试 一、统一配置管理 案例练习的时候我们只有两个微服务,管理起来非常简单,但…

el-upload上传文件

需求:选中或拖拽文件后,使用http-request属性实现自动上传,并根据后端传回来的结果显示错误和控制fileList的显示,如果后端返回成功,则文件显示在文件列表处,如果后端返回失败,则文件列表不显示…

Qt/QML编程学习之心得:Timer的使用(22)

Qt中timer计时器如何使用? Timer的创建: void InitTimer(){myTimer = new QTimer(q);myTimer->setInterval(100); // 100msmyTimer->setSingleShot(true); //只运行一次的计时器QObject::connect(myTimer,SIGNAL(timeout()),q,SLOT(onTimeOut()));myTimer->start(…

Oracle分区表

文章目录 A. varchar2类型时间字段(20240102)分区实战1. 表要不要分区2. 将已经存在的表改造为分区表(时间字段,varchar2类型)3. 增加分区3.1 增加分区3.2 置换分区,不会复制索引,不要用这种语法建表,这是专门为置换分区用的3.3 分…

SonarQube 漏洞扫描

SonarQube 漏洞扫描 一、部署服务 1.1 docker方式部署 #安装docker curl -L download.beyourself.org.cn/shell-project/os/get-docker-latest.sh | sh yum install -y docker-compose #进去输入:set paste可以保证不穿行 [rootlocalhost sonar]# vim docker-compose.yml v…

java基于SSM的游戏商城的设计与实现论文

基于SSM的游戏商城的设计与实现 摘 要 当下,正处于信息化的时代,许多行业顺应时代的变化,结合使用计算机技术向数字化、信息化建设迈进。以前相关行业对于游戏信息的管理和控制,采用人工登记的方式保存相关数据,这种以…

【C++】内存对齐

本篇文章介绍C中的内存对齐,后续介绍C的union和C的variant的时候,需要用到这部分的知识。 占用内存 先回忆下C各个数据类型占用的内存大小: int:所占内存大小:4byte 32bit;char:所占内存大小…

x-cmd-mod | zuz - 压缩或解压文件

目录 简介首次用户子命令x zuz zx zuz uzx zuz uzrx zuz ls 相关链接 简介 zuz 为 x-cmd 中的必用模块之一,提供压缩与解压文件的功能。 x z 就是调用 x zuz z,可将目标文件压缩根据后缀名成指定格式,x uz 则可以解压任何格式的压缩包 首次…