C语言进阶四:(指针和数组笔试题解析1)

 一维数组:

sizeof是计算内存大小的,strlen是计算字符串的长度。

int main()
{//一维数组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));
}

解析:数组名是首元素的地址但是sizeof和&除外,在sizeof里只有单独一个数组名时计算的是整个数组的大小,第二个 a + 0 里面不止数组名,所以就是首元素的地址,地址都是4个或者8个字节。

第六个()里面是&a,&a是取出整个数组的地址,是地址就是固定大小。下一个的()里是 *&a,

&a是取出整个数组的地址,解引用作用相抵消,所以是整个数组的大小。()里是&a[0],a[0]是第一个元素,取出地址。

字符数组:

int main()
{//字符数组char arr[] = {'a', 'b', 'c' , 'd' , 'e' , 'f'};printf("%zd\n", sizeof(arr));//答案:6printf("%zd\n", sizeof(arr + 0));// 8printf("%zd\n", sizeof(*arr));// 1 因为*arr ,arr是数组名,是数组首元素的地址printf("%zd\n", sizeof(arr[1]));// 1  char类型的大小是一个字节printf("%zd\n", sizeof(&arr));// 8 因为取出整个数组的地址也是一个地址,地址的大小是 4 / 8 个字节printf("%zd\n", sizeof(&arr + 1));// 8 取出了数组的地址加1,也是一个地址printf("%zd\n", sizeof(&arr[0] + 1));// 8 取出了第一个元素的地址加1,是地址printf("%zd\n", strlen(arr));// 因为整个字符数组里没有\0,strlen遇到\0才停下,所以这个答案应该是随机值printf("%zd\n", strlen(arr + 0));// strlen函数的参数是char*,所以跟上面一样是随机值printf("%zd\n", strlen(*arr));// ()里不是char*指针,会出错printf("%zd\n", strlen(arr[1]));// 跟上面同理printf("%zd\n", strlen(&arr));// 就算是取出的是整个数组的大小,他的值和首元素的地址也是一样的,所以也是随机值printf("%zd\n", strlen(&arr + 1));// 随机值printf("%zd\n", strlen(&arr[0] + 1));// 随机值
}

字符数组(字符串):

//字符串数组
int main()
{char arr[] = "abcdef";printf("%zd\n", sizeof(arr));//答案:7 因为是字符串,里面有\0,\0算一个字节,所以是7printf("%zd\n", sizeof(arr + 0));// 8 sizeof里是单独的数组名计算的就是整个数组的大小,这里面不止数组名,所以就是首元素地址的大小,就是 4/ 8个字节 printf("%zd\n", sizeof(*arr));// 1 第一个元素的大小,因为是char 所以是 1printf("%zd\n", sizeof(arr[1]));// 1 第二个元素的大小printf("%zd\n", sizeof(&arr));// 8 取出的是整个数组的地址,也是地址,所以是 4 / 8 个字节printf("%zd\n", sizeof(&arr + 1));// 8 是一个地址printf("%zd\n", sizeof(&arr[0] + 1));// 8 是一个地址printf("%zd\n", strlen(arr));// 6 因为有\0 ,所以算的是字符串里的元素多少printf("%zd\n", strlen(arr + 0));// 6 arr + 0 也是首元素的地址,所以还是6printf("%zd\n", strlen(*arr));// 报错printf("%zd\n", strlen(arr[1]));// 报错printf("%zd\n", strlen(&arr));// 6 取出的是整个数组的大小,但是值和首元素的地址一样的printf("%zd\n", strlen(&arr + 1));// 随机值,因为取出了整个数组的地址,+1之后跳过了整个数组,也跳过了\0printf("%zd\n", strlen(&arr[0] + 1));// 5 取出了第一个元素的地址+1,就是第二个元素的地址
}

常量字符串:

//常量字符串
int main()
{char* p = "abcdef";// 常量字符串放到一个字符指针里,p里是 a 的地址printf("%zd\n", sizeof(p));//答案:8 p是 a 的地址,所以是 4/8 个字节printf("%zd\n", sizeof(p + 1));// 8 也是地址printf("%zd\n", sizeof(*p));// 1 解引用之后是'a'printf("%zd\n", sizeof(p[0]));// 1  p[0] == *(p + 0)printf("%zd\n", sizeof(&p));// 8 是一个地址,二级指针printf("%zd\n", sizeof(&p + 1));// 8 地址printf("%zd\n", sizeof(&p[0] + 1));// 8 地址printf("%zd\n", strlen(p));// 6 是 a 的地址,到\0停下printf("%zd\n", strlen(p + 1));// 5 a 的地址+1,就是b的地址,从b开始向后算printf("%zd\n", strlen(*p));// 出错printf("%zd\n", strlen(p[0]));// 出错printf("%zd\n", strlen(&p));// 随机值,取出的是指针p的地址。printf("%zd\n", strlen(&p + 1));// 随机值printf("%zd\n", strlen(&p[0] + 1));// 5 ()里是b的地址
}

二维数组:

int main()
{//二维数组int arr[3][4] = { 0 };printf("%zd\n", sizeof(arr));//答案是:48 sizeof()是单独的数组名,所以是计算整个数组的大小printf("%zd\n", sizeof(arr[0][0]));// 4 因为是一个元素,int类型的printf("%zd\n", sizeof(arr[0]));// 16 因为二维数组相当于是数组的数组,所以arr[0]相当于是第一行的数组名,是第一行首元素的地址,但是又单独在()里,所以是第一行数组的大小printf("%zd\n", sizeof(arr[0] + 1));// 8 arr[0]是第一行数组的数组名,数组名是首元素的地址,+1之后也是一个地址printf("%zd\n", sizeof(*(arr[0] + 1)));// 4 解引用一个int*的地址,就是int类型的大小printf("%zd\n", sizeof(arr + 1));// 8  arr是二维数组的数组名,就是指向第一行数组的地址,是地址就是固定大小printf("%zd\n", sizeof(*(arr + 1)));// 16 解引用得到的是第一行数组的数组名,所以是第一行数组的大小printf("%zd\n", sizeof(&arr[0] + 1));// 8 arr[0]是一维数组的数组名,取出地址的地址,然后+1printf("%zd\n", sizeof(*(&arr[0] + 1)));// 16 解引用之后是第二行一维数组的数组名,所以()里是一个一维数组的数组名,计算整个数组的大小printf("%zd\n", sizeof(*arr));// 16 arr没有单独在括号里,所以是首元素的地址,解引用首元素的地址得到的是第一行一维数组的数组名printf("%zd\n", sizeof(arr[3]));// 16 他会报错越界访问吗?不会,因为sizeof不会真实的访问arr[3],sizeof是根据类型属性决定的}

总结:

主要是关于数组名的意义,1.sizeof(数组名)这里计算的就是整个数组的大小

2.&数组名,这里就是取出的是整个数组的地址

3.除此之外的所有数组名都表示首元素的地址

(补充:表达式是有值属性和类型属性,sizeof是根据类型属性判断的)。

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

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

相关文章

GitLab邮箱发送邮件:如何实现自动化发信?

gitlab邮箱发送邮件设置教程?Gitlab邮箱配置和使用? GitLab不仅提供了代码版本控制、持续集成/持续部署等功能,还支持通过其内置的邮件功能实现自动化邮件发送。AokSend将深入探讨如何在GitLab中配置和使用邮箱发送邮件功能。 GitLab邮箱发…

ERP进销存管理系统的业务全流程 Axure高保真原型源文件分享

这是一套ERP进销存管理系统的业务全流程Axure高保真原型设计文档。 原型预览地址:https://ppndif.axshare.com 产品意义: 提高工作效率: 电子记账替代手工记账,减少工作负担和人为错误。 实时查看库存情况,减少盘点时…

Tomcat_WebApp

Tomcat的目录的介绍 /bin: 这个目录包含启动和关闭 Tomcat 的脚本。 startup.bat / startup.sh:用于启动 Tomcat(.bat 文件是 Windows 系统用的,.sh 文件是 Linux/Unix 系统用的)。shutdown.bat / shutdown.sh&#xf…

ICMC 2024 has Arrived, and We’ll See You There

It’s finally time for the International Cryptographic Module Conference this year! ICMC 2024 will perhaps be the most energized ICMC to date, as post-quantum cryptography (PQC) – a topic that’s been weighing on most of our minds – features prominently …

大模型研发全揭秘:带你掌握训练后模型的最佳存储方案

在大模型项目的研发中,模型保存是每个AI从业者都必须掌握的重要技能。保存模型不仅能让我们在未来进行推理和预测,还能帮助我们继续优化和调整模型。因此,掌握如何高效保存模型显得尤为重要。本文将通过详细的技术细节和清晰的步骤&#xff0…

使用密钥文件登陆Linux服务器

假设A服务器为登陆目标,已经运行ssh服务。 B服务器作为登陆发起端。 登陆A服务器,账户S。 运行命令: ssh-keygen -t rsa 此时账户S家目录下会自动创建目录“.ssh”,目录下会有id_rsa和id_rsa.pub两个文件。 id_rsa为私钥,id_rsa.pub为公钥。 id_rsa文件内容下载到B服务…

【无人机/平衡车/机器人】详解STM32+MPU6050姿态解算—卡尔曼滤波+四元数法+互补滤波(文末工程资料下载)

效果: 目录 基础知识详解 欧拉角 加速度计(Accelerometer)与姿态测量 陀螺仪(Gyroscope)与姿态测量 姿态解算算法1-互补滤波 姿态解算算法2-四元数法 姿态解算算法3-卡尔曼滤波 组成 1.预测状态方程 2. 预测协方差方程 3. 卡尔曼增益方程 4. 跟新最优值方程(卡尔…

攻防世界--->BABYRE

做题笔记。(可以作为例题。) 下载 查壳 64ida打开。 分析: 动态试一试。 跟进judge 很奇怪是一段.data(数据段) 报错,但是程序并没有结束: 我们对其进行处理:(动态函数处理) 因为call不能用在.data段&…

4.qml单例模式

这里写目录标题 js文件单例模式qml文件单例模式 js文件单例模式 直接添加一个js文件到qml中 修改内容 TestA.qml import QtQuick 2.0 import QtQuick.Controls 2.12 import "./MyWork.js" as MWItem {Row{TextField {onEditingFinished: {MW.setA(text)}}Button…

Docker部署及基本操作

Docker是一个开源的平台 ,用于开发、交付和运行应用程序。它能够在Windows,macOS,Linux计算机上运行,并将某一应用程序及其依赖项打包至一个容器中,这些容器可以在任何支持Docker的环境中运行。容器彼此隔离&#xff0…

MySQL实战面试题(附案例答案+建表语句+模拟数据+案例深度解析),练完直接碾压面试官

知识点思维导图 案例1 建表语句与模拟数据 用户表 users CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE, signup_date DATE NOT NULL ); INSERT INTO users (username, email, signu…

『功能项目』QFrameWork框架重构OnGUI【63】

我们打开上一篇62QFrameWork背包框架的项目, 上文将功能实现在一个脚本中 本章要做的事情让脚本实现背包框架思想 首先按照图示创建脚本: 创建脚本:Item.cs namespace QFramework {public class Item{//道具public string Key;public string …

2024秋季云曦开学考

web ezezssrf 打开环境,代码审计 看起来有点多,要绕过五层 第一层:存在弱比较,使用数组或0e绕过 yunxi[]1&wlgf[]2 yunxis878926199a&wlgfs155964671a 第二层:存在强比较,此处使用string限制…

superset 解决在 mac 电脑上发送 slack 通知的问题

参考文档: https://superset.apache.org/docs/configuration/alerts-reports/ 核心配置: FROM apache/superset:3.1.0USER rootRUN apt-get update && \apt-get install --no-install-recommends -y firefox-esrENV GECKODRIVER_VERSION0.29.0 RUN wget -q https://g…

【智路】智路OS airos-edge

欢迎来到智路OS https://gitee.com/ZhiluCommunity/airos-edge 智路OS是全球首个开源开放的智能网联路侧单元操作系统(简称“智路OS”), 是以高等级自动驾驶技术为牵引,沉淀出来的“车路云网图”一体化的智能交通基础软件平台。…

Ansible——Playbook基本功能

文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1)“play”2)“task”3)“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法:1. 基本结构2. 数据类型3. 列表4. 字典(映射)5. 注释…

【数据结构】排序算法---归并排序

文章目录 1. 定义2. 算法步骤3. 动图演示4. 性质5. 算法分析6. 代码实现C语言——迭代版C语言——递归版PythonJavaC——迭代版C——递归版Go 结语 1. 定义 归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法&#xff0…

CentOS7.9环境上NFS搭建及使用

Linux环境NFS搭建及使用 1. 服务器规划2. NFS服务器配置2.1 主机名设置2.2 nfs安装2.2.1 repo文件替换2.2.2 NFS服务安装 2.3 nfs配置2.4 服务查看2.5 资源发布2.6 配置nfs服务开机自启2.7 端口开放 3.应用服务器配置3.1 主机名设置3.2 nfs安装3.2.1 repo文件替换3.2.2 NFS服务…

你真的需要理解Diffusion(扩散模型),它在视觉领域具有无与伦比的美丽!

【Vision结合Diffusion】模型的研究方向,探索了如何利用扩散模型在数据空间中模拟随机游走的特性,以生成高质量和逼真的图像。这一领域的研究,通过结合视觉感知和文本描述,推动了图像合成技术的发展,尤其是在个性化图像…

对人像图添加指定光源,再进行二次扩图

在一些业务场景中,需要对人像图片添加特定光源,来增加氛围感,例如赛博朋克科技、海边夕阳余晖、以及红蓝相间的高冷;但实现这个功能的难点是:如何将光源与原图片融合,在图片上产生正常光的镜面反射&#xf…