gpt4 book ai didi

c - 鉴于字节内存地址不是 int 类型,int 类型的 C 指针如何保存内存地址?

转载 作者:太空宇宙 更新时间:2023-11-04 07:00:50 24 4
gpt4 key购买 nike

我正在查看 "Pointers in C: when to use the ampersand and the asterisk" 的答案并且对示例 int *p2 = &i; (来自 Dan Olson 的回答)感到困惑

i 的地址不是 int,它类似于 0x02304,对吧?那么我们如何将它放入 p2 中呢?鉴于字节内存地址不是 int 类型,int 类型的 C 指针如何保存内存地址?

谢谢!

附言对于在这一点上感到困惑的任何人,我发现另一个有用的线程(虽然它没有为我回答这个问题)是 "What exactly is a C pointer if not a memory address"祝你好运。

最佳答案

我认为 int *p2 = &i; 令人困惑的原因是同时声明和实例化以及间距的综合效果。我会解释。

通常,对于指向整数的指针 p2 和整数 i,写入“*p2”会取消引用 p2 并给出位于地址 &iint

所以代码“int *p2 = &i;”让它看起来像一个 int 被设置为等于一个内存地址。

确实是代码

int i = 1;
int *p2;
*p2 = &i

是错误的,因为在最后一行中,*p2 是一个 int 因为它是 p2 解引用的,并且 &i 是一个指针。

为什么 int *p2 = &i; 做的事情与上面有缺陷的代码的最后一行不同:

代码int *p2 = &i;与上面3行代码不同,因为它是一个声明。当你声明一个指针变量时,你把类型(例如 intlongchar 等)和你的名字变量(像正常一样) - 你还在这两部分之间放了一个星号 * (请参阅上面关于许多间距选项的@chqrlie回答 - takehome是最好的做法是坚持* 到变量名)。在声明中,* 不是取消引用指针。相反,它告诉编译器变量 myPointer 将是指向内存的指针,该内存保存已声明类型的数据(intlongchar 等)。因此,在代码“int *p2 = &i;”中,同时声明和实例化指针的地方,* 不会呈现 int 在左边。对于声明,虽然将 * 放在变量名称旁边更安全(正如@chqrlie 指出的那样),但即使在声明中实例化了指针,这也不会打开指针。对于声明,将 * 视为附加到类型(而不是附加到变量名,这是有充分理由的)。我喜欢在指针名称旁边用 * 声明指针,但只要了解在声明中实例化指针时,对于新学习者来说,想象该行的一种可能更清晰的方式是 int* p2 = &1:

int* (type pionter-to-int) p2 (指针名称) = &i (等于给出地址的指针整数 i) ;

感谢所有回答和评论的人,祝所有可能来到这里试图弄清楚指针的人好运。

关于c - 鉴于字节内存地址不是 int 类型,int 类型的 C 指针如何保存内存地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38557911/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com