美文网首页
C++ 指针转long的问题

C++ 指针转long的问题

作者: hehehehe | 来源:发表于2020-10-19 16:55 被阅读0次

    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
    

    相关文章

      网友评论

          本文标题:C++ 指针转long的问题

          本文链接:https://www.haomeiwen.com/subject/ecflmktx.html