c++ - 保存变量的地址

浏览:26日期:2023-04-19

问题描述

#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 : %xn',&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 : ac7db3d00x7ffeac7db3d4 : ac7db3d40x7ffeac7db3d8 : ac7db3d80x7ffeac7db3dc : ac7db3dc

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

问题解答

回答1:

题主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 : %xn',&a[i],b ); }}

c++ - 保存变量的地址

把地址存进long long的数组,当成整型,就可以处理哒。

回答2:

看报错信息

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是一个好的选择。

相关文章: