zoukankan      html  css  js  c++  java
  • 关于指针

     1 #include <iostream>
     2 using namespace std;
     3 
     4 struct Test
     5 {
     6     int Num;
     7     char *pcName;
     8     short sDate;
     9     char ch[2];
    10     short str[4];
    11 }*p;
    12 
    13 void main()
    14 {
    15     p = (Test*)0x100000;
    16 
    17     printf("p+0x01  ->  0x%08x
    ", p+0x01);
    18     printf("(unsigned long)p+0x01  ->  0x%08x
    ", (unsigned long)p+0x01);
    19     printf("(unsigned int*)p+0x01  ->  0x%08x
    ", (unsigned int*)p+0x01);
    20 }
    View Code

     

    这个题主要考查指针,算的上经典。

    struct Test结构体的大小是20byte(十六进制0x14)

    所以

    p+0x01,此时p还是Test *类型,故根据指针运算规则,p+0x1,p的值实际上是往后移Test *的大小,即0x100000+0x14 = 0x100014

    (unsigned long)p+0x01,这里先将p强制类型转换为unsigned long型,则加法运算将其当作一个数来运算,所以为普通的加法,结果自然为0x100000+1 = 0x100001

    (unsigned int*)p+0x01,这里先将p强制类型转换为unsigned int*型,即转换为一个unsigned int*的指针,unsigned int占4个字节的大小,则p+0x01往后移4个字节,即0x100000+0x4 = 0x100004

    这里实际上要理解,在32位机上,指针本身始终只占用4个字节的空间,指针的类型只不过是给编译器解释它的值的时候使用的,什么类型的指针,编译器就知道指针的值所表示的是一个什么结构的数据。

    这也是为什么在函数传参时使用指针高效的原因,因为始终只占4个大小的空间,而在函数中可以依据指针的类型将值取出来。

    而传值时是拷贝操作,如果一个结构体很大,会很低效。

    这些行为都跟编译器有关。

  • 相关阅读:
    一篇文章让你了解GC垃圾回收器
    使用SpringBoot整合ssm项目
    SpringBoot项目集成Hystrix
    50个简单易懂的经济学定律
    使用POI导出EXCEL工具类并解决导出数据量大的问题
    数据库事务的四大特性以及四种隔离级别
    简单了解Redis
    如何更规范化的编写JAVA 代码
    如何在Linux服务器上部署Mysql
    常见的数据库函数,关键字整理
  • 原文地址:https://www.cnblogs.com/witxjp/p/4964896.html
Copyright © 2011-2022 走看看