c中的数组名到底是什么?

2024-05-13

我很难理解 C 中数组名称的类型和使用。这可能看起来很长,但请耐心等待。

我理解以下声明声明a属于类型int [] i.e 整数数组.

int a[30];

While a还指向数组的第一个元素以及诸如此类的东西*(a+2)是有效的。因此,使得a看起来像一个指向整数的指针。但实际上类型int [] and int*是不同的;而前者是数组类型后来是一个指向整数的指针.

也是一个类型变量int []被转换为类型变量int*将其传递给函数时;如C数组通过引用传递(除了sizeof操作员)。

让我犹豫不决的一点来了。看一下下面的代码:

int main()
{
    int (*p)[3];
    int a[3] = { 5, 4, 6 };

    p = &a;

    printf("a:%d\t&a:%d\n",a,&a);
    printf("%d",*(*p + 2));
}

OUTPUT:

a:2686720       &a:2686720
6

那么,上面的代码是如何工作的呢?我有两个问题:

  1. a and &a具有相同的值。为什么?
  2. 到底是做什么的int (*p)[3];做?它声明了一个指向数组的指针, 我知道这个。但如何是一个指向数组的指针不同于指向数组第一个元素的指针 and 数组的名称?

有人能澄清一下吗?我有很多困惑。

我知道我应该使用%p作为占位符而不是使用%d用于打印指针变量的值。因为使用整数占位符可能会打印截断的地址。但我只是想让事情变得简单。


Other answers already explained the issue. I am trying to explain it with some diagram. Hope this will help.


当你声明一个数组时

int a[3] = {5, 4, 6}  

内存排列看起来像

现在回答你的问题:

  1. a and &a具有相同的值。如何?

正如你已经知道的那样a是数组类型和数组名称a成为指向数组第一个元素的指针a(衰减后),即它指向地址0x100。注意0x100也是内存块的起始地址(数组a)。你应该知道,一般来说,第一个字节的地址称为变量的地址。也就是说,如果一个变量有 100 个字节,那么它的地址等于它的第一个字节的地址。

&a是整个内存块的地址,即它是数组的地址a。看图:

现在你可以明白为什么了a and &a尽管两者的类型不同,但它们具有相同的地址值。

它到底是做什么的int (*p)[3];声明一个指向数组的指针,我知道这一点。但是,指向数组的指针与指向数组第一个元素和数组名称的指针有何不同?

看上图,清楚地解释了指向数组的指针与指向数组元素的指针有何不同。
当你分配时&a to p, then p指向具有起始地址的整个数组0x100.


NOTE:关于线路

...如C数组通过引用传递(除了sizeof功能)。

在 C 中,参数是按值传递的。 C 中没有按引用传递。当普通变量传递给函数时,其值为copied;对相应参数的任何更改都不会影响该变量。
数组也是按值传递,但不同之处在于数组名称衰减为指向第一个元素的指针,并将此指针分配给函数的参数(这里,指针值被复制);数组本身不会被复制。
与普通变量相比,用作参数的数组不会受到任何更改的保护,因为数组本身没有副本,而是复制指向第一个元素的指针。

您还应该注意的是sizeof不是函数,在这种情况下数组名称不充当参数。sizeof is an operator和数组名称作为operand。当数组名称是一元操作数时,同样成立&操作员。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c中的数组名到底是什么? 的相关文章

  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 总和不小于 key 的数组的最小子集

    给定一个数组 假设为非负整数 我们需要找到最小长度子集 使得元素之和不小于 K K 是作为输入提供的另一个整数 是否有可能找到时间复杂度为 O n n 的大 oh 的解决方案 我目前的想法是这样的 我们可以在 O n log n 中对数组进
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 如何在 C++ 中标记字符串?

    Java有一个方便的分割方法 String str The quick brown fox String results str split 在 C 中是否有一种简单的方法可以做到这一点 The 增强分词器 http www boost o
  • suhosin.mt_srand.ignore 在 PHP 中一致洗牌数组的解决方法?

    我有一个 PHP 脚本 需要随机化一个具有一致结果的数组 这样它就可以向用户呈现前几个项目 然后如果他们愿意 他们可以从同一个打乱的集合中提取更多结果 我目前使用的是这个 基于我相信的 Fisher Yates 算法 function sh
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 在 Unity 中实现 Fur with Shells 技术

    我正在尝试在 Unity 中实现皮毛贝壳技术 http developer download nvidia com SDK 10 5 direct3d Source Fur doc FurShellsAndFins pdf Fins 技术被
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • Fortran 子例程返回错误值

    嘿 我正在开发一个 Fortran 程序 遇到了一个奇怪的问题 当我尝试在调用特定子例程之前直接输出数组的某些值时 我得到了正确的值 然后 我尝试在启动子例程时输出同一数组的一些值 它们都是 0 我最终在子例程之后输出数组的值 并且这些值回
  • 如何实例化 ODataQueryOptions

    我有一个工作 简化 ODataController用下面的方法 public class MyTypeController ODataController HttpGet EnableQuery ODataRoute myTypes pub
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri

随机推荐

  • Perl 导入到我的所有包中?

    我倾向于经常使用 Data Dumper 最终我的 pl 代码中每个包的顶部都有以下样板 use strict use warnings use Data Dumper Data Dumper Deparse 1 Data Dumper P
  • Docker 中的 Airflow:如何将 DAG 添加到 Airflow?

    我想将 DAG 文件添加到 Airflow 它在 Ubuntu 上的 Docker 中运行 我用了以下git 存储库 https github com puckel docker airflow 包含配置和 docker 镜像的链接 当我跑
  • 有没有办法使用现有的结构作为枚举变体?

    我使用枚举来实现多态性 类似于以下内容 enum MyType Variant1 a i32 b i32 Variant2 a bool b bool 有没有干净的方法来使用现有的结构Variant1 and Variant2 我做了以下事
  • 使用 dnx/.net core 更改输出程序集和包的名称

    我有一个项目存在于名为Oracle我希望创建的工件被称为MyCompany MyApp Oracle代替Oracle 除了更改目录名称之外 我可以选择哪些选项来更改输出程序集名称和 nuget 包名称 我目前有一个MyCompany MyA
  • 将数据从 MS SQL 导入 MySQL

    我想从 MS SQL Server 导入数据 通过某种正则表达式运行它以过滤掉内容 然后将其导入 MySQL 然后 对于每个查询 我希望显示来自第三个数据库的相关图像 明智地导入和链接 最简单的方法是什么 谢谢 澄清 它是一个 PHP 应用
  • lambda 表达式的 noexcept 和empty throw 规范之间有什么区别吗?

    举个例子 double values 2 5 3 5 4 5 5 5 6 5 7 5 std vector
  • 当 flutter 应用程序终止时,普通推送通知会默默出现或根本不出现

    我在 nodejs 上使用 firebase admin 向用户发送推送通知 https firebase google com docs admin setup https firebase google com docs admin s
  • 向 jQuery .toggle() 方法添加 WAI-ARIA 支持

    我想配对怀阿利亚aria hidden http www w3 org TR wai aria states and properties aria hidden支持 jQuery 的 toggle 方法 所以给出 p Hi there p
  • mPDF 临时文件不可使用 Yii 写入

    我尝试打印 PDF 格式的证书 但是当我将代码推送到暂存阶段时 它说 Temporary files directory var www protected vendor mpdf mpdf src Config tmp is not wr
  • 风暴最大喷口待定

    这是一个关于 Storm 的最大喷口待处理如何工作的问题 我目前有一个 spout 它读取文件并为文件中的每一行发出一个元组 我知道 Storm 不是处理文件的最佳解决方案 但我对此问题没有选择 我设置了topology max spout
  • 监控进程的网络使用情况?

    C 或 C C Win32 中有没有一种方法可以监视某个进程的网络使用情况 显然没有您构建的应用程序 我想只监视 1 个进程大约一个小时左右 然后返回仅该进程 例如 Limewire 使用的字节 是否可以 我知道 Windows 上的 ne
  • NGINX 上的 SSL 终止

    我已经购买了 SSL 证书 并在验证模数时正确地将其捆绑在一起 即https kb wisc edu middleware 4064 https kb wisc edu middleware 4064 那么哈希值是相同的 我已将证书和密钥移
  • Git - 推送到远程存储库中的远程跟踪分支

    当简单地做git push到远程存储库 其master分支得到更新 对于非裸存储库来说 这是不希望出现的情况 最近的 Git 版本显示的警告消息清楚地表明了这一点 我希望能够推送到远程存储库 并拥有其之一远程追踪分支进行更新 稍后 当我登录
  • 每次我尝试将任何内容上传到 android 模拟器时都会出现 IOException

    我使用的是 Windows 7 Ultimate 64 位版本和带有 Android 插件的 Eclipse 3 5 每次我创建一个新项目并尝试发布它时 都会收到如下错误 2010 02 15 22 48 10 EPG3 Uploading
  • Flask 未激活调试模式

    我正在开始使用 Flask 我正在尝试遵循一些教程 但我无法在调试模式下运行 Flask 应用程序 我尝试了我发现的最简单的代码 from flask import Flask app Flask name app debug True I
  • 如何使用 Laravel Mix 和 WorkBox?

    我正在尝试为我的应用程序构建一个 PWA 并花了近 48 小时试图弄清楚如何将 Workbox 与 Laravel Mix 结合使用 具有讽刺意味的是 谷歌说 Workbox 是为了让事情变得简单 Buh 好吧 到目前为止我已经弄清楚了 我
  • 无法在项目上执行目标 org.apache.maven.plugins:maven-surefire-plugin:2.12:test (default-test)。

    几天来我一直在尝试解决以下错误 但无法解决 我的模块的 pom xml 文件是
  • Apache:重定向用户,但保持相同的路径?

    我希望能够将用户重定向到不同的 TLD 但保持相同的路径 例如 如果用户访问 example com cars 10 使用 apache 如何将用户重定向到类似以下内容 my new site com cars 10 如果您的服务器启用了
  • Java 类查找工具

    任何经常使用 Java 的人都知道类路径中的多个 jar 会给我们带来多少麻烦 我正在寻找一个可以帮助我的工具 在 jar 中搜索类文件类路径 在 jar 中搜索类文件具体位置 也许要求太多 但请告诉我同一个类是否存在于多个罐子中 不用说它
  • c中的数组名到底是什么?

    我很难理解 C 中数组名称的类型和使用 这可能看起来很长 但请耐心等待 我理解以下声明声明a属于类型int i e 整数数组 int a 30 While a还指向数组的第一个元素以及诸如此类的东西 a 2 是有效的 因此 使得a看起来像一