C++ 指针转long的问题
linux 下查看进程内存占用top -d 1 -p 23536
linux下 指针可以强转long,再强转指针取到值
vs下 要用8个字节的long long
long long j = (long long)p; 指针转long得到的是地址的long型,
int * p = (int*)j; p的值是j,j是地址,p指向j地址
地址没有明确数据类型,都是一个整数值的地址值, 但地址值有类型
地址的本质就是一串0和1的机器代码,内存中的地址没有明确数据类型,但地址值有类型,以32位编译器为例,内存中的地址是一个32位的整数。无论什么类型的指针变量,在内存中本质上都是一样的,都是一个整数值的地址值,该地址值可以转换为其他类型,比如float或char,但一般不要强转,此时已不再是合法地址而是一个单纯的数据值,除了没有意义外,还会出现数据读取错误(后面会解释)。
指针长度
指针字节长度计算原理其实跟int差不多,一个指针的位数和操作系统的位数是相等的,即32位系统应该是4个字节,64位系统应该是8个字节。
操作系统位数指的是内存寻址宽度,32位是2的32次方,即4GB,而64位系统是2的64次方
操作系统位数
关于32位与64位:
首先,需要明确一个概念,32位指的是CPU的地址总线数目为32条。也就是说,我们一般说的32位操作系统以及64位操作系统都是假定的CPU的地址总线数目为32位或者64位。
第二,地址总线是干嘛的?地址总线简单地说就像身份证号码一样,是用一串数字来标记一个存储位的地址。就像身份证号码一样,用一串数字来标定一个人,即使别人与你重名或者其他信息相同都不要紧,只要这串数字是唯一的就好。
第三,地址总线是如何来运行使用的?通过以上描述,我们可以看出,地址总线是用来标定一个存储区的位置的,那么32位究竟能标定多少位置呢?在电脑的运算中都是以二进制来计算的,也就是说一条地址总线就只能表示0跟1两个数字,
那么,运用排列组合的方式,32条地址总线总共可以组合出2的32次方个数字,也就是4294967296个数字。那么每个数字又对应着一个存储位,一般来说,一个存储为的大小一般为1Bit,也就是说4294967296个存储为共有4294967296Bit大小的空间,
也就是4294967296/1024KB=4194304/1024MB=4GB。说到这里你可能会很好奇,明明32位可以完全支持4G,为什么系统只能识别到3.25GB呢?这是由于32条地址总线并不是全部用来控制CPU与内存之间的通信的,而是还要控制CPU与显卡之间,
CPU与硬盘等等设备之间的通信,也就是说,如果加入这些设备,实际上可以用来控制CPU与内存之间通信的地址线也就不足32条了,这也就解释了为什么系统无法完全识别到4GB内存的原因了
int i1 = 5;
int *p = &i1;
long long j = (long long)p;//十六进制地址转十进制
printf("Value of j pointed is: %d\n", *(int*)j);
cout << *(int*)j << endl; 5
cout << sizeof(int) << endl; 4
cout << sizeof(long) << endl; 4
cout << sizeof(long long) << endl; 8
cout << sizeof(double) << endl; 8
cout << sizeof(p) << endl; 8
int *a = new int(1);
long long b = (long long)a;
cout << *(int*)b << endl; 1
C++
#include<iostream>
using namespace std;
int main(){
int i1 = 5;
int *p = &i1;
long j = (long)p;//十六进制转十进制
cout << *(int*)j << endl;
int* a = new int(3);
long b = (long)a;
cout<<*(int*)b<<endl;
return 0;
}
# g++ a.cpp
(base) [root@shoffice-dev-app5.server-10.43.75.119 /home/las/jni_coordtrans] ens192 = 10.43.75.119
# ./a.out
5
3
C
#include <stdio.h>
int main() {
int i1 = 5;
int *p = &i1;
long j = (long)p;//十六进制转十进制
printf("Value of j pointed is: %d\n", *(long*)j);
long* a = malloc(2);
*a = 88;
long b = (long)a;
printf("Value of b pointed is: %d\n", *(long*)b);
printf("%d",23);
return 0;
}
# gcc a.c
a.c: In function ‘main’:
a.c:10:12: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration]
long* a = malloc(2);
^~~~~~
a.c:10:12: warning: incompatible implicit declaration of built-in function ‘malloc’
a.c:10:12: note: include ‘<stdlib.h>’ or provide a declaration of ‘malloc’
(base) [root@shoffice-dev-app5.server-10.43.75.119 /home/las/jni_coordtrans] ens192 = 10.43.75.119
# ./a.out
Value of j pointed is: 5
Value of b pointed is: 88