&pointer 如何具有指向指针的类型?

2023-12-27

struct node
{
       int a;
};

int main()
{
 
    struct node y = {23};
    struct node *x = &y;

    return 0;
}

这是我遇到的一些代码,我弄乱了代码并发现"&x"有类型指针到指针。我很困惑这是怎么回事,所以我把它画出来并制作了一个程序来尝试找出下面的内容,x 的地址为 0x123,y 的地址为 0x24:

我的理解是&x返回指针 x 的地址,*&x返回的地址x点也,它返回一个地址而不是另一个指针。那么类型如何成为指向指针的指针呢?据我所知:

  1. x 是一个指针
  2. 取消引用 x 与 *x 相同,其类型为 (struct node *)
  3. 我认为这是相同的,因为x只是指针变量的别名,引用它的地址或别名(x)时没有区别。

最后,这是我的程序,它说明了这一点并进一步使我困惑,因为我认为程序中的内容是正确的:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

struct node
{
       int a;
};


int main()
{
    struct node y = {23};
    struct node *x = &y;

    printf("\n\nstruct node y = {23}\nstruct node *x = &y;\n\n");

    printf("address of x is: %p\naddress of y is: %p\n", &x, &y);

    printf("\n&x address is:   %p\n", &x);
    printf("*&x address is:  %p\n", *&x);
            
}

该程序的输出如下所示:

struct node y = {23}
struct node *x = &y;

address of x is: 0x7ffdedcc2da0
address of y is: 0x7ffdedcc2d9c

&x address is:   0x7ffdedcc2da0
*&x address is:  0x7ffdedcc2d9c

我认为是正确的,并将其与我的图表进行比较表明它是正确的。


我的理解是 &x 返回指针 x 的地址,*&x 也返回 x 指向的地址,它返回一个地址而不是另一个指针。那么类型如何成为指向指针的指针呢?据我所知:

让我们一步一步地完成这个过程,并确保我们对所有术语都准确无误。

x属于类型struct node *,即指向节点的指针。因此,它是一个指针。

&x is an 表达(同样的方式1 + 2是一个表达式)。表达式不会“返回”任何内容;他们评估为一些结果有value and a type。在这种情况下,我们应用&运算符至x。结果值有一个type指向节点的指针(在 C 语法中,struct node**)。您不需要做任何困难的思考就可以理解这一点:由以下结果产生的类型&是指向-的指针(无论该事物的类型是什么)&适用于)。在我们的例子中,(无论该事物的类型是什么)&适用于)是“指向节点的指针”,我们直接将其替换为:typeof(&x) is (typeof x)*这是(struct node *)*这是struct node **。 (我认为你实际上不能使用(typeof x)*作为类型声明;我只是用看起来有点像 C 语言的东西来展示类型演算。)

The value该表达式的地址是现有的x多变的。那是what & does。这里的问题是“地址而不是另一个指针”没有意义,因为“地址”不是一种不同的类型。当我们说“x的地址”时,我们的意思是“一个具有指针类型的东西(无论x的类型是什么),以及一个告诉我们x在内存中的位置的值”。

当我们写的时候*&x,这是另一个表达式,我们在其中应用*子表达式的运算符&x。从功能上来说,*撤销的效果&;它的意思是“指定位置的东西”,并且该类型具有一级“指针”removed.

取消引用 x 与 *x 相同,其类型为 (struct node *)

小心你的语言。*x确实“与取消引用 x 相同”,也就是说,它是我们表达的方式代码中的这个想法。x是一个类型的指针struct node *; thus, *x是指向的值,类型为struct node.

printf("\n&x address is:   %p\n", &x);
printf("*&x address is:  %p\n", *&x);

我想这就是你自己困惑的地方。你标记为的东西"&x address"不是地址&x, 但反而&x本身,即地址x。 (就像第一个中的那样printf你打印了同样的东西 -&x- 并将其标记为“x的地址”。)当然打印*&x给你和打印一样的东西&y, 因为*&x只是x (the *撤消&),即&y(因为就是这样x已初始化)。您甚至不需要考虑类型就可以进行这种推理(尽管您will从长远来看,需要考虑类型,以便编写正确的代码)。


当然,也有局限性:你不能只写成对的& and *只要你愿意,就可以将它们组合在一起,然后将它们抵消。*需要应用于指针,并使用&稍后无法使您摆脱该要求。相似地,&需要应用于具有定义位置的事物,并使用*稍后无法使您摆脱该要求。特别是,您不能连续申请&&到某物,因为第一个产生的地址&是临时的,并且在概念上没有地址(在编译的代码中,它可能只出现在寄存器中并且永远不会写入内存)。

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

&pointer 如何具有指向指针的类型? 的相关文章

随机推荐

  • Chrome 自动填充涵盖了 Google Maps API v3 的自动完成功能

    我正在使用 Google Maps Javascript v3 在 HTML 输入字段上设置自动完成功能 如下所示 https i stack imgur com sbBKv png https i stack imgur com sbBK
  • 外键(class_id)未填充在belongs_to关联中

    我是 Rails 新手 正在 Rails3 beta4 上构建一个小型测试应用程序 我在用真实逻辑管理用户会话 以标准方式设置为根据本教程 http github com binarylogic authlogic example 我已经搭
  • Angular Mat-Table 完成渲染事件 / Mat Paginator 加载 Spinner

    我正在使用带有相当大的预查询数据源的角度材质表 现在 每次我使用内置分页器更改表格页面时 在呈现新表格行之前都会有一个短暂的延迟 并且我想同时显示一个加载微调器 问题是 当表页开始更改时 分页器只会触发一个事件 到目前为止 我没有找到解决方
  • cassandra-cli 在哪里

    我已经使用 docker 安装了 Cassandra 3 7 我正在读一本书 要求我运行一个名为 cassandra cli 的实用程序 但是当我做一个find name cassandra cli我在任何地方都找不到这个实用程序 你知道我
  • Java 错误 - net.ucanaccess.jdbc.UcanaccessSQLException:格式错误的字符串:'

    我在使用 uCanaccess 检索保存在桌面中的数据库时出现错误 我的代码如下 package Week11Package 导入java util Scanner 导入 java sql 公共类 dbTest1 static Scanne
  • 阻止 spring-data-rest 中的 HTTP 方法

    我正在使用 spring data rest 给出以下存储库 RepositoryRestResource public interface MyRepository extends PagingAndSortingRepository
  • 在 java 8 中使用正确的偏移量将 OffsetDateTime 转换为 LocalDateTime

    当我尝试转换时OffsetDateTime to LocalDateTime来自 java time 我期望结果LocalDateTime将更新为本地时区 所以 如果我有一个OffsetDateTime of 2011 12 03T10 0
  • 基于php的Photoeffects网站

    我想知道网站怎么样http photofunia com http photofunia com 并建立了其他在线照片效果网站 例如 使用php 我想将两个图像frame png与profile jpg合并 我希望我的frame png 透
  • 替换网站中的文本

    我正在寻找使用 JavaScript 替换网页 任何我想要运行它的网页 中的文本 我不是 JavaScript 专家 所以我有点迷失了 如果可以的话我想避免使用 jQuery 通过谷歌 我发现this https stackoverflow
  • 在sqlite中将int转换为real

    sqlite 中的除法返回整数值 sqlite gt select totalUsers totalBids from select select count from Bids as totalBids select count from
  • 获取javaFX 8中节点的屏幕坐标

    我正在 Windows 8 1 64 位上开发 JavaFX 应用程序 具有 4GB RAM 和 JDK 版本 8u45 64 位 我想使用捕获部分屏幕Robot但问题是我无法获取我想要捕获并且不想使用的锚点窗格的屏幕坐标snapshot因
  • 在图像悬停时显示播放图标

    目标 当我将鼠标悬停在 item 图像上时 我希望 play 图像出现在 item 图像 div 的中心 我做了以下事情 play img 与 itemImage img 重叠 HTML div class itemsContainer i
  • Java 的 BouncyCastle 并不总是验证 OpenSSL ECDSA 签名

    我使用 OpenSSL 在 C 中 对文本进行签名 但是我的 Java 程序并不总是验证签名消息 只有大约五分之一得到验证 有趣的是https kjur github io jsrsasign sample sample ecdsa htm
  • 为什么 .title(for: .normal) 对于 UIKit 中的 Plain 样式返回 nil

    我正在关注 Apple 的 Apple Pie 项目Swift 基础知识开发 https books apple com us book develop in swift fundamentals id1556365994书 第 333 3
  • HTML 登录表单:提供用户名、自动填充密码

    我需要一个登录表单 只需提供我的用户名 因为它会记住我的密码并自动填写密码字段 例如 像 gmail auth 一样 我怎样才能做到这一点 thanks Luca 提醒人们避免用头撞墙的注意事项 Chrome 不会在不受信任的网站上保存和建
  • python:带有字符串输入的调度方法

    我需要编写一个接受 3 个参数的方法 a string带有函数名称 一个有序的list该函数的参数 这包括具有默认值的参数和 varargs 但不包括 kwargs a dict表示任何附加关键字参数 或None如果没有 我需要使用此输入来
  • android-opencv 使用 matToBitmap/bitmapToMat 将 mat 转换为灰度

    我在 eclipse 中使用更新的 willowgarage opencv 库 我想将 mat 变量转换为灰度 我已经尝试了在网上找到的所有内容 但它们对我不起作用 这是我的代码 package com deneme deneme impo
  • 获取 Java 时区的夏令时转换日期

    我想知道在 Java 中最简单的方法来获取未来夏令时将发生变化的日期列表 一种相当不优雅的方法是简单地迭代多年的日子 并根据 TimeZone inDaylightTime 测试它们 这会起作用 而且我不担心效率 因为这只需要在每次我的应用
  • 我应该在 C# 项目中使用 WPF 还是 Windows 窗体应用程序?

    我正在开发一个基于客户端 服务器的应用程序 其中客户端应用程序将访问服务器数据库来存储计费信息 它还将具有报告生成功能 Windows 窗体在文档打印方面表现出色 但我在 WPF 中没有看到这样的功能或控件 如果我错了 请纠正我 我想要数据
  • &pointer 如何具有指向指针的类型?

    struct node int a int main struct node y 23 struct node x y return 0 这是我遇到的一些代码 我弄乱了代码并发现 x 有类型指针到指针 我很困惑这是怎么回事 所以我把它画出来