c++ - 保存变量的地址
高洛峰
高洛峰 2017-04-17 14:30:00
0
2
708
#include <cstdio>
int main(int argc, char const *argv[])
{
    int aa[10]={1,2,3,4};
    int * a = aa;
    for (int i = 0; i < 4; ++i)
    {
    unsigned int b = (int)&a[i];
    printf("%p : %x\n",&a[i],b );
    }
}

b保存的是a[i]的地址,但是正常编译会出错,

a.cpp:6:24: warning: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
  unsigned int b = (int)a;
                        ^

通过-fpermissive参数之后,error变成warning可以正常运行,某次的结果如下:

0x7ffeac7db3d0 : ac7db3d0
0x7ffeac7db3d4 : ac7db3d4
0x7ffeac7db3d8 : ac7db3d8
0x7ffeac7db3dc : ac7db3dc

为什么输出会不一样?
另外,如何正常保存变量的地址到一个数组,以便后续对这个“地址数字”进行操作?(就是后面想对0x7ffeac7db3d0这样的数据进行操作,而不是看成一个地址了)

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

全部回覆(2)
左手右手慢动作

題主64位元機子嗎?看編譯錯誤,好像是轉換導致出錯了。 64位,指標是8byte,而int是4byte。好像是這個問題,我改成long long就編譯過了。

#include <cstdio>
int main(int argc, char const *argv[])
{
    int aa[10]={1,2,3,4};
    int * a = aa;
    for (int i = 0; i < 4; ++i)
    {
    unsigned long long b = (long long)&a[i];
    printf("%p : %x\n",&a[i],b );
    }
}

把位址存進long long的數組,當成整數,就可以處理噠。

巴扎黑

看報錯訊息

a.cpp:6:24: warning: cast from ‘int*’ to ‘int’ loses precision [-fpermissive]
  unsigned int b = (int)a;
                        ^

意思是int*轉換為int會失去精確度。因為int*int型別所佔的記憶體大小是不一樣的。
使用-fpermissive參數,是強制採取寬容模式,允許精度遺失。
因為通常的機器都是小端序的(你這裡就是),所以在整數轉換的時候,若是不能儲存更多位,那麼就只能儲存下低位的,也就是尾數部分。

盡量不要使用int等類型來保存記憶體位址,使用對應的指標類型,或void*類型。你應該是在linux下吧,使用intptr_t是一個好的選擇。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!