美文网首页
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的问题

    linux 下查看进程内存占用top -d 1 -p 23536linux下 指针可以强转long,再强转指针取到...

  • C++指针强转与打印的问题

    问题引入 我在使用某些供应商提供的库的时候发现,他们的指针在linux下面强转为了long,而long不仅会表示这...

  • C++知识点

    C++基本方法: C++ memcpy C++基本特性: C++引用(vs指针) C++指针 C++封装: 将...

  • c语言有这几种基本类型

    int,float,double,long,long long,char,指针,short 可以查看C语言各数据类...

  • C++11(1)-智能指针

    C++裸指针的内存问题有:1、空悬指针/野指针2、重复释放3、内存泄漏4、不配对的申请与释放 使用智能指针可以有效...

  • java-date和long日期相互转换

    [TOC] date日期转long日期 long日期转date日期 String日期转long日期 String日...

  • C++内存常见问题

    C++ 里可能出现的内存问题大致有这么几个方面: 缓冲区溢出(buffer overrun)。 空悬指针/野指针。...

  • C++ 指针常量、常量指针和常指针常量

    参考:C++ 指针常量、常量指针和常指针常量

  • [转]C/C++野指针

    一、 莫名的恐惧感对于指针确实有种莫名的恐惧感,从刚开始学习的时候就被老师灌输的概念是指针功能很强大,但是用得不够...

  • C++ 类指针的问题

    这一部分要谈的是指针的类型。 Q1 : 一个指向class-a的指针,和一个指向class-b的指针 它们有什么区...

网友评论

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

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