gpt4 book ai didi

c++ - 自引用指针算法

转载 作者:太空狗 更新时间:2023-10-29 23:30:25 25 4
gpt4 key购买 nike

因此给出以下代码:

#include <iostream>
#include <vector>

int main(int argc, char* argv[]) {
int i = 42;
int* p = &i;

std::cout << "*p: " << *p << std::endl;
std::cout << "&p: " << &p << std::endl;
std::cout << "p: " << p << std::endl;
std::cout << "p + 1: " << (p + 1) << std::endl;
std::cout << "p + 1: " << ((p + 1) == (int*)(&p)) << std::endl;
std::cout << "*(p + 1): " << *(p + 1) << std::endl;
return 0;
}

它可能会产生以下输出:

*p: 42
&p: 0x7fff38d8a888
p: 0x7fff38d8a884
p + 1: 0x7fff38d8a888
p + 1: 1
*(p + 1): 953723012

(p + 1) 是指向存储位置p 的指针吗?这样可以得到p指向的值吗?

最佳答案

p 是指向 int 对象的指针。&p 是 p 的地址。

您示例中的堆栈如下所示:

Address        Type       Name        Value
0x7fff38d8a884 int i 42
0x7fff38d8a888 int* p 0x7fff38d8a884

栈的设置方式,p的地址紧跟在i的地址之后。在这种特殊情况下,当你将 1 添加到 p 时,它向下移动 4 个字节并找到那里的值,它恰好是 i 的地址。

行中发生了什么

std::cout << "p + 1: " << ((p + 1) == (int*)(&p)) << std::endl;

is p+1 --> 编译器获取数组 p 的“第二个元素”的地址(int*)(&p) --> &p 是一个 int**,但是被转换为一个 int*,int 这个特定的实例,恰好与存储在 p + 4 字节中的值相同

行中发生了什么

std::cout << "*(p + 1): " << *(p + 1) << std::endl;

is *(p+1) --> 编译器访问数组 p 的“第二个元素”,因为您可能使用 x86_64 系统,它是小端,存储在那里的十六进制值是0x38D8A884,p中存放的指针的低半部分(十进制转换为953723012)。

关于c++ - 自引用指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20596856/

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