arr的谜思

news2024/10/1 17:17:44

arr到底是个啥?

在C语言中,arr 本身不是一个指针,而是一个数组名。然而,在大多数表达式中,数组名会被转换为指向数组首元素的指针。这种转换是自动的,并且是C语言的一个基本特性。

具体来说,当你声明了一个数组 int arr[] = { 1, 2, 3, 4, 5 }; 后,arr 代表了整个数组。但是,当你尝试在表达式中使用 arr(除了作为 sizeof 或 & 操作数的上下文中),它会被解释为指向数组首元素(即 arr[0],值为 1)的指针。

在你的例子中,printf("%d\n", arr); 这行代码实际上是不正确的,因为它试图以整数(%d)的形式打印一个指针(arr 在这个表达式中被解释为指向 arr[0] 的指针)。这会导致未定义行为,因为 %d 格式说明符期望一个整数参数,而你传递的是一个指针。

如果你想打印 arr 数组首元素的地址(即 arr 指针的值),你应该使用 %p 格式说明符,并将指针转换为 void* 类型(尽管在很多编译器中直接传递 int* 也是可以工作的,但转换为 void* 是更标准、更可移植的做法):

 

c复制代码

#include<stdio.h>
int main()
{
int arr[] = { 1, 2, 3, 4, 5 };
printf("%p\n", (void*)arr); // 打印数组首元素的地址
// 或者更具体地打印第一个元素的地址(这实际上是相同的)
printf("%p\n", (void*)&arr[0]);
return 0;
}

注意,虽然 arr 在表达式中通常被当作指针处理,但记住它本身不是一个指针变量。它是一个数组名,而数组名和指针在C语言中有微妙的区别。例如,你不能像修改指针那样修改数组名来指向数组中的另一个元素或另一个数组。数组名在声明之后就是固定的,指向其首元素。

printf("%p\n", &arr);为什么main函数中输出arr的地址时要加&,arr不是会自动转化为首地址吗?

在 C 语言中,当你使用数组名 arr 在大多数表达式中时,它确实会自动转换为指向其首元素的指针。但是,当你使用 &arr 时,你得到的是指向整个数组的指针,而不是指向数组首元素的指针。

这里的关键是理解数组和指针之间的区别:

  • arr(不带 &)在表达式中通常会被解释为指向数组首元素的指针,即 int* 类型的指针,指向 arr[0]
  • &arr 则是获取整个数组的地址,其类型是指向数组类型的指针,即 int (*)[N],其中 N 是数组的长度。在这个例子中,如果 arr 是一个长度为 5 的整型数组,那么 &arr 的类型就是 int (*)[5]

然而,当你使用 %p 格式说明符与 printf 函数时,你可以打印出任何指针类型的值,包括指向数组的指针。但是,由于 %p 期望的是一个 void* 类型的参数,所以最好将指针显式转换为 void* 以避免类型不匹配警告(尽管在许多情况下,编译器会隐式地进行这种转换)。

在 main 函数中,如果你想要打印出数组 arr 的“地址”(实际上是数组首元素的地址),你不需要使用 &arr,因为 arr 本身就会转换为这样的指针。但是,如果你想要强调的是你正在获取整个数组的地址(尽管这在大多数实际用途中并不常见),你可以使用 &arr。然而,请注意,当你使用 %p 打印 &arr 时,你实际上看到的是整个数组在内存中的起始位置,这与数组首元素的地址在数值上是相同的,但它们的类型意义不同。

这里是一个示例,展示了如何打印数组首元素的地址和整个数组的地址(尽管它们在数值上可能相同):

#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
printf("Address of the first element: %p\n", (void*)&arr[0]); // 或简化为 (void*)arr
printf("Address of the entire array: %p\n", (void*)&arr);
return 0;
}

在这个例子中,两个 printf 调用都会打印出相同的地址值,但它们的含义不同。第一个打印的是数组首元素的地址,第二个打印的是整个数组的地址(尽管在内存布局上,这两个地址是相同的)。

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

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

相关文章

LDR6020快充线,科技与便捷的新宠

在快节奏的现代生活中&#xff0c;充电效率成为了我们不可忽视的一个重要因素。随着智能手机、平板电脑等电子设备的普及&#xff0c;快充线以其独特的优势逐渐成为充电设备市场的新宠。 快充线&#xff0c;相比于传统的普通充电线&#xff0c;快充线在充电速度上有着显著的提升…

Linux用户-sudo命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注我&#xff0c;我尽量把自己会的都分享给大家&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。…

明日周刊-第19期

演唱会现场的感受确实跟耳机里的感觉非常不一样&#xff0c;听见音响和人声真真切切出现在你身边&#xff0c;那种震撼可以让你暂时忘却生活的烦恼。感谢8月3日的蔡健雅演唱会&#xff0c;凑巧的是这一场是今年巡演的最后一场。 文章目录 资源分享言论歌曲推荐 资源分享 nginx…

DC-8靶机通关

今天我们来学习DC-8这个靶机&#xff01;&#xff01;&#xff01; 1.实验环境 攻击机&#xff1a;kali2023.2 靶机&#xff1a;DC-8 2.1主机扫描 2.2端口扫描 还是熟悉的配方&#xff01;&#xff01;&#xff01; 3.1查看网页 其实可以先尝试一下爆破&#xff0c;但是爆…

在VScode中导入conda环境的记录【原创】

今天在vscode编辑器中运行一个python代码&#xff0c;发现终端可以运行&#xff0c;但是编辑器中点击Run会显示缺包&#xff0c;但是python包明明是有的&#xff0c;在自己的conda环境中。后来发现&#xff0c;是vscode没有发现我自己创建的conda环境&#xff0c;在vscode中导入…

暑假第三周——学生管理系统仿写

iOS学习 前言账号界面主页添加学生信息&#xff1a;修改学生信息&#xff1a;删除学生信息&#xff1a;学生信息排序&#xff1a;查找学生信息 总结 前言 学生管理系统的仿写较为简单&#xff0c;与c语言的学生管理系统逻辑上相差不大。 账号界面 账号界面与3G share的相同&am…

推荐几款卓越的 .NET 开源搜索组件

目录 前言 一、Lucene.NET 1、介绍 2、地址 二、Elasticsearch.NET 和 NEST 1、介绍 2、文档地址 3、开源地址 三、Algolia.Search 1、介绍 2、文档地址 3、开源地址 四、SolrNet 1、介绍 2、文档开源地址 3、Solr社区 五、Masuit.LuceneEFCore.SearchEngine …

网页设计师必备!10个免费的设计素材网站推荐

当网页设计师使用网页设计材料时&#xff0c;他们会优先考虑那些免费和高质量的网页设计材料网站。找到一个免费和高质量的网页设计材料网站并不容易&#xff0c;有些网站要么需要打开材料网站成员&#xff0c;要么设计材料质量很差。即时设计总结了10个免费的网页设计材料网站…

iAppv3无白银会员使用SDK

前言 一个实用小技巧分享给大家。 工具 iapp&#xff1a;百度或点我获取 Mt管理器&#xff1a;百度或点我获取 教程 1.移出“项目路径/apk/lib/”内的全部文件 2.在iapp内测试打包&#xff0c;打包完成后直接返回&#xff0c;不要安装 3.在mt管理器里面点击“项目路径/b…

常见CMS漏洞(WordPress、DeDeCMS、ASPCMS、PHPMyadmin、Pageadmin)

目录 一&#xff1a;WordPress 步骤一:进入Vulhub靶场并执行以下命令开启靶场;在浏览器中访问并安装好子... 步骤二:思路是修改其WP的模板写入一句话木马后门并访问其文件即可GetShel;登陆WP后点击【外观】--》【编辑】 --》 404.php 步骤三:访问以下连接即可获取WebShel...…

【Linux】wsl win安装Linux环境

文章目录 wsl是什么配置wsl启用适用于 Linux 的 Windows 子系统安装 Linux 分发版 文件互操作参考文章 win 下安装linux其实很简单&#xff0c;百度一下wsl就明白了 wsl是什么 WSL&#xff08;Windows Subsystem for Linux&#xff09;是微软开发的一项技术&#xff0c;允许用…

七、分散加载说明

分散加载说明以GD32F103ZE为例&#xff0c;分别用Keil、IAR和Embedded Builder工具实现&#xff1a;将函数放置某个地址、将常量放置某个地址、将函数放在RAM中运行的三种效果。 1、将led_toggle()函数放在0x08040000地址后。 2、将tempbuf[1024]常量放在0x08020000地址后。 …

React管理系统整合Cesium避坑指南

花费了一周时间将React 升级到了最新版本18&#xff0c;同时整合Cesium三维模块到系统中&#xff0c;其中遇到了react 版本升级后模块删改&#xff0c;按照原来的引入方式无法使用的问题&#xff0c;以及Cesium 放入子路由一直404等问题 文章目录 一、系统版本依赖二、系统预览…

3.10.全卷积网络FCN

全连接卷积神经网络&#xff08;FCN&#xff09; ​ FCN是用来深度网络来做语义分割的奠基性工作&#xff0c;用转置卷积层来替换CNN最后的全连接层&#xff0c;从而可以实现对每个像素的预测 ​ CNN(卷积神经网络)可以认为是一个预训练好的模型。CNN的最后一层是全局平均池化…

【C++学习第19天】最小生成树(对应无向图)

一、最小生成树 二、代码 1、Prim算法 #include <cstring> #include <iostream> #include <algorithm>using namespace std;const int N 510, INF 0x3f3f3f3f;int n, m; int g[N][N]; int dist[N]; bool st[N];int prim() {memset(dist, 0x3f, sizeof di…

十大机器学习算法-学习笔记-章节1-线性回归—

一、前言 学习视频&#xff1a;第一章&#xff1a;线性回归原理推导 1-回归问题概述_哔哩哔哩_bilibili 相关资料 该内容仅作为个人笔记使用&#xff0c;希望看到的各位能有所获&#xff0c;博主有误的地方&#xff0c;各位可以在评论区有所指正 二、正文 1、线性回归 什…

CTF-web基础 web服务器

web服务器作用 web服务器是一个服务器软件&#xff0c;我们可以把静态网页部署到web服务器上&#xff0c;web‘服务器通常只能运行静态网页。 应用服务器可以运行动态网页&#xff0c;web服务器通常和应用服务器一起使用。 原理 当我们输入网页时&#xff0c;他会发送请求到…

2024小学生古诗文大会暑期备考:吃透历年真题和知识点(持续)

最近有一些家长朋友问好真题网&#xff0c;上海三年级以上的小学生有什么比较有价值的比赛可以参加&#xff1f;结合众多孩子的反馈和参与情况&#xff0c;好真题网体检参加上海市汉字小达人比赛活动、上海市小学生古诗文大会、AMC8美国数学竞赛等&#xff0c;主要针对的是语文…

使用Python创建多功能文件管理器

简介 在本文中&#xff0c;我们将探索一个使用Python的wxPython库开发的文件管理器应用程序。这个应用程序不仅能够浏览和选择文件&#xff0c;还支持文件预览、压缩、图片转换以及生成PPT演示文稿的功能。 C:\pythoncode\new\filemanager.py 完整代码 import wx import os …

ChatGLM3Loader发生错误Library cudart is not initialized

ChatGLM3Loader执行时发生错误&#xff1a; Library cudart is not initialized。 文章《Chatglm3部署踩坑记录》里提到是因为没有安装 CUDA Toolkit 引起。 1、用 nvidia-smi.exe 命令查看显卡当前驱动程序版本 2、NVIDIA CUDA 工具包发行说明&#xff0c;每个 CUDA 工具包版…