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

news2025/1/11 7:58:35

目录

引言 

一:一维数组

举例如下

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.coloradmin.cn/o/1351727.html

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

相关文章

CMake入门教程【基础篇】CMake+Visual Studio2022构建C++项目

文章目录 1.概述2.Visual Studio 2022简介3.安装Visual Studio 20224.安装CMake5.创建CMake项目6. 构建项目 1.概述 CMake和Visual Studio 2022结合 在现代软件开发中,CMake和Visual Studio 2022的结合提供了一个强大的环境,用于构建和管理各种规模的C项…

STM32 学习(二)GPIO

目录 一、GPIO 简介 1.1 GPIO 基本结构 1.2 GPIO 位结构 1.3 GPIO 工作模式 二、GPIO 输出 三、GPIO 输入 1.1 传感器模块 1.2 开关 一、GPIO 简介 GPIO(General Purpose Input Output)即通用输入输出口。 1.1 GPIO 基本结构 如下图&#xff0…

C++基础:静态变量(保姆级讲解)

1.静态变量定义 在C的,静态变量是一个非常有用的特性,它在程序执行期间只初始化一次,并在程序的整个执行期间都保持其值。 可能这样子说大家无法特别理解:静态变量该怎么定义呢?静态变量的作用是什么?该如…

算法29:不同路径问题(力扣62和63题)--针对算法28进行扩展

题目:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff0…

网络端口(包括TCP端口和UDP端口)的作用、定义、分类,以及在视频监控和流媒体通信中的定义

目 录 一、什么地方会用到网络端口? 二、端口的定义和作用 (一)TCP协议和UDP协议 (二)端口的定义 (三)在TCP/IP体系中,端口(TCP和UDP)的作用 (…

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个,想起这玩意就难受,贼难配置。由于要用到里面的一个库,不得已再进行配置。看网上的博客是真的难受,这写一块,那里写一块,乱七八糟,配置一顿发现写的都是错的,还得…

leetcode刷题日记:222. Count Complete Tree Nodes(完全二叉树的节点个数)

这一道题,我们可以选择直接进行二叉树的遍历,将所有结点遍历一遍就能得到完全二叉树的结点个数,时间复杂度为O(n)。 代码如下: int countNodes(struct TreeNode* root) {if(rootNULL){return 0;}return countNodes(root->left…

【Linux】socket基础API

目录 1. 创建socket(TCP/UDP,客户端服务器) 1.1 第一个参数——domain 1.2 第二个参数——type 1.3 第三个参数——protocol 2. 绑定socket地址(TCP/UDP,服务器) 2.1 字节序及转换函数 2.2 IP地址及…

【数字图像处理技术与应用】2023-2024上图像处理期中-云南农业大学

一、填空题(每空2 分,共 30 分) 1、图像就是3D 场景在 二维 平面上的影像,根据其存储方式和表现形式,可以将图像分为 模拟 图像和数字图像两大类; 2、在用计算机对数字图像处理中,常用一个 二…

[C#]yolov8-onnx在winform部署手势识别模型

【官方框架地址】 https://github.com/ultralytics/ultralytics.git 【算法介绍】 YOLOv8 是一个 SOTA 模型,它建立在以前 YOLO 版本的成功基础上,并引入了新的功能和改进,以进一步提升性能和灵活性。具体创新包括一个新的骨干网络、一个新…

promise.prototype.finally重写和兼容火狐低版本浏览器

一、finally()方法用于指定不管 Promise 对象最后状态如何,都会执行的操作。该方法是 ES2018 引入标准的 let promise new Promise() promise .then(result > {}) .catch(error > {}) .finally(() > {})finally方法的回调函数不接受任何参数;finally方法…

指令、电流、上下斜坡、颤振频率可调型比例放大器

控制不带电反馈的单或双比例电磁铁的比例阀,如比例泵阀、比例插装阀、比例方向阀、比例压力阀、比例流量阀、比例叠加阀等; 常规比例阀控制电流如650mA、700mA、760mA、830mA、950mA、1.6A、2.5A、3A等; 带数显区显示及当前参数现场可调,如…

php合并数组的几种方式 并简述其特点

目前工作中接触到的PHP数组合并方式主要有三种&#xff1a; 1、操作符 2、array_merge() 3、array_merge_recursive() 它们的区别主要体现在对于相同键名&#xff08;数字键名、字符串键名&#xff09;的处理方式&#xff0c; 一 相同字符串键 <?php$arrFirst [&quo…

键盘数字键打不出来怎么解锁?收藏好这4个简单方法!

“我在使用电脑进行办公时&#xff0c;突然发现我电脑键盘的数字键无法输入&#xff0c;这该怎么办呢&#xff1f;我应该如何解锁呢&#xff1f;请给我出出主意吧&#xff01;” 在日常使用电脑时&#xff0c;很多用户都需要使用键盘输入文字。但有时候部分用户也会遇到键盘数字…

SpringBoot: 通过MyBatis访问ClickHouse

一、ClickHouse中建表&#xff0c;添加数据 二、SpringBoot项目添加mybatis、clickhouse、druid相关依赖 <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency>…

【Proteus仿真】【Arduino单片机】汽车尾气检测报警系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真Arduino单片机控制器&#xff0c;使用按键、LCD1602液晶、蜂鸣器模块、CO、NOx、HC和PM2.5气体传感器等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示CO、NOx、HC和…

【算法】和为K的连续子数组

牛客链接&#xff1a;https://www.nowcoder.com/practice/704c8388a82e42e58b7f5751ec943a11?tpId196&&tqId37127&rp1&ru/ta/job-code-total&qru/ta/job-code-total/question-ranking 使用【前缀法】&#xff0c;把所有连续和合索引存进哈希表&#xff0c…

55寸oled透明显示屏售价,受哪些因素影响

55寸OLED透明显示屏的售价受到多个因素的影响&#xff0c;包括以下几个方面&#xff1a; 尺寸和分辨率&#xff1a;OLED透明显示屏的尺寸和分辨率是决定价格的重要因素。较大的尺寸和较高的分辨率会增加制造成本和售价。 技术水平和制造工艺&#xff1a;OLED透明显示屏的技术水…

超高速同步PCI数据采集卡PCI8552A

◆ 输入量程&#xff1a;1000mV ◆ 转换精度&#xff1a;12 位(Bit) ◆ 采样频率(Frequency)&#xff1a;最高 150MHz ◆ 物理通道数&#xff1a;2 通道同步 ◆ 模拟量输入方式&#xff1a;单端模拟输入 ◆ 数据读取方式&#xff1a;DMA方式 ◆ 存储器深度&#xf…