RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 625641
Accepted
MaximPro
MaximPro
Asked:2020-02-09 20:26:32 +0000 UTC2020-02-09 20:26:32 +0000 UTC 2020-02-09 20:26:32 +0000 UTC

从数组中获取地址

  • 772

大家都知道数组名就是数组第一个元素的地址,但是如果不是从数组名中取地址,一切都会这么简单。

有这个数组声明:char array[] = "String";

如果我们写:arrayor &array[0]- 我们得到数组中第一个元素的地址,第一个选项是隐式的,第二个是显式的。

我想嗯,如果我写&array- 乍一看,没什么奇怪的,地址与 forarray或相同&array[0],但如果我们深入挖掘一点,那就是&array+1- 我们会看到地址会随着行的长度增加(对我来说这很奇怪,从来没有这个我没有看到它,除了在参数中,当参数是指向特定数量元素数组的指针时,就像现在一样)

我想知道是否有替代此行为的方法 ( &array)?到目前为止,我已经想到了这种方式:(char (*)[sizeof(array)])array- 但它是对的吗?

此外,以下行为很有趣:如果我们写,*array我们将得到一个与唯一的区别是它的地址算法从整个数组下降到单个字符。array[0]*(&array)

是否可以说在这种情况下它正在将指针重命名为指向字符的指针级别(这种指针降级)?

*(&array)在您看来,当我们编写时,数组通常会发生什么情况?

c
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Harry
    2020-02-09T20:37:38Z2020-02-09T20:37:38Z
    char array[] = "String";
    

    类型array是char[7]7 个字符的数组。
    因此,&array是指向 7 个字符的数组的指针。
    所以,&array+1是指向下一个7 个字符数组的指针。好吧,a*(&array)是一个由 7 个元素组成的数组char(粗略地说,与 相同array)。

    “我认同。” (c) 绒毛

    • 3
  2. Best Answer
    Vlad from Moscow
    2020-02-09T20:48:47Z2020-02-09T20:48:47Z

    如果你有一个视图指针

    T *p;
    

    然后 1) 该值用于指针算术sizeof( T ),以及 2) 取消引用指针给出lvalue指针指向的位置。

    例如,如果您有以下代码片段

    int a[] = { 1, 2 };
    int *p = &a[0];
    

    那么执行表达式后指针的值++p将等于

    значение указателя перед инкрементом плюс значение sizeof( int )
    

    在这种情况下,结果指针将指向元素a[1]。

    如果有下一个数组的声明

    char array[] = "String";
    

    那么它相当于下面的数组声明

    char array[7] = "String";
    

    如果您输入 typedef 声明

    typedef char T[7];
    

    那么上面数组的声明也可以写成

    T array = "String";
    

    因此,要声明一个指向该对象的指针,应该这样写

    T *p = &array;
    

    并且,如上所示,对于指针 的指针运算p,使用表达式sizeof( T ),它等于sizeof( char[7] )。

    通过取消引用此指针,您将获得lvalue一个类型的对象char[7]

    这可以通过运行句子轻松检查

    printf( "%zu\n", sizeof( *p ) );
    

    这将产生一个值7,即类型数组的长度char[7]。

    然而,当有一个数组作为在取消引用指针后获得的对象时,它被转换为表达式,极少数例外是指向其第一个元素的指针。

    来自 C 标准(6.3.2.1 左值、数组和函数指示符)

    3 除非它是 sizeof 运算符或一元 & 运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“类型数组”的表达式将转换为类型为“指针”的表达式to type'' 指向数组对象的初始元素并且不是左值。如果数组对象具有寄存器存储类,则行为未定义。

    因此,对于上面的示例,如果表达式*p未用作 operatorsizeof或 operator的操作数&,则结果数组将隐式转换为指向其第一个元素的指针。因此,例如,表达式**p将给出一个类型char为 value的对象'S'。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5