在有关C的信誉良好的来源中,在讨论了&
运营商之后给出了以下信息:
...有点不幸的是,术语[地址]仍然存在,因为它混淆了那些不知道地址是什么的人,并误导那些做的人:把指针当作地址通常会导致悲伤...... .
我读过的其他材料(来自同等声誉的来源,我会说)总是毫不掩饰地将指针和&
操作符称为给出内存地址.我很想继续寻找事情的实际情况,但是当信誉良好的消息来源不同意时,这很难.
现在我有点困惑 - 究竟什么是指针,那么,如果不是内存地址?
PS
作者后来说:......我将继续使用"地址"一词,因为发明一个不同的 [术语] 会更糟.
考虑以下程序:
struct ghost
{
// ghosts like to pretend that they don't exist
ghost* operator&() const volatile { return 0; }
};
int main()
{
ghost clyde;
ghost* clydes_address = &clyde; // darn; that's not clyde's address :'(
}
Run Code Online (Sandbox Code Playgroud)
我怎么得到clyde
地址?
我正在寻找一种适用于所有类型对象的解决方案.C++ 03解决方案会很好,但我也对C++ 11解决方案感兴趣.如果可能,让我们避免任何特定于实现的行为.
我知道C++ 11的std::addressof
函数模板,但我不想在这里使用它:我想了解标准库实现者如何实现这个函数模板.
我应该使用哪种格式说明符来打印变量的地址?下面很多我很困惑.
%u - 无符号整数
%x - 十六进制值
%p - 无效指针
哪个是打印地址的最佳格式?
当您object.__repr__()
在Python中调用该方法时,您会得到类似这样的内容:
Run Code Online (Sandbox Code Playgroud)<__main__.Test object at 0x2aba1c0cf890>
如果你超载__repr__()
,有没有办法得到一个内存地址,除了调用super(Class, obj).__repr__()
和重新出现之外?
请看下面的图片.当我们用java创建一个带有new关键字的对象时,我们从OS获取一个内存地址.
当我们写作时,new
我们可以看到一个"特殊"字符串作为输出.我的问题是:
如果是操作系统给我们的内存地址:
a)如何将此字符串转换为二进制?
b)如何获得一个整数变量地址?
我正在阅读STL源代码,我不知道&&
运算符应该做什么.以下是一个代码示例stl_vector.h
:
vector&
operator=(vector&& __x) // <-- Note double ampersands here
{
// NB: DR 675.
this->clear();
this->swap(__x);
return *this;
}
Run Code Online (Sandbox Code Playgroud)
"地址"是否有意义?为什么它有两个地址运算符而不是一个?
我想做一些看似相当简单的事情.我得到了结果,但问题是,我无法知道结果是否正确.
我在C工作,我有两个指针; 我想打印指针的内容.我不想取消引用指针来获取指向的值,我只想要指针存储的地址.
我写了下面的代码,我需要知道的是,如果它是正确的,如果没有,我该如何纠正它.
/* item one is a parameter and it comes in as: const void* item1 */
const Emp* emp1 = (const Emp*) item1;
printf("\n comp1-> emp1 = %p; item1 = %p \n", emp1, item1 );
Run Code Online (Sandbox Code Playgroud)
虽然我发布这个(以及重要的是它是正确的)是我最终需要这样做一个指针到指针.那是:
const Emp** emp1 = (const Emp**) item1;
Run Code Online (Sandbox Code Playgroud) 如何在Python 2.7中打印变量的内存地址?我知道id()返回变量或对象的'id',但这不会返回我期望看到的内存地址的预期0x3357e182样式.我想做类似的事情,例如print &x
,x是C++ int变量.我怎么能用Python做到这一点?
我注意到字符串文字在内存中的地址与其他常量和变量(Linux OS)的地址非常不同:它们有许多前导零(不打印).
例:
const char *h = "Hi";
int i = 1;
printf ("%p\n", (void *) h);
printf ("%p\n", (void *) &i);
Run Code Online (Sandbox Code Playgroud)
输出:
0x400634
0x7fffc1ef1a4c
Run Code Online (Sandbox Code Playgroud)
我知道它们存储在.rodata
可执行文件的一部分中.操作系统之后是否有一种特殊的方式处理它,所以文字最终会出现在一个特殊的内存区域(带有前导零)?这个内存位置有什么优点还是有什么特别之处呢?
我知道每个人都讨厌搞砸.在我的代码中,由于我考虑过并且很满意的原因,他们提供了一个有效的解决方案(即我不是在寻找"不要那样做"作为答案,我理解你的预订,并理解我为什么使用它们无论如何).
到目前为止,它们一直很棒,但我希望以这样的方式扩展功能,这要求我基本上能够存储指向标签的指针,然后再转到它们.
如果此代码有效,它将代表我需要的功能类型.但它不起作用,30分钟的谷歌搜索没有透露任何东西.有没有人有任何想法?
int main (void)
{
int i=1;
void* the_label_pointer;
the_label:
the_label_pointer = &the_label;
if( i-- )
goto *the_label_pointer;
return 0;
}
Run Code Online (Sandbox Code Playgroud)