C++指针小结:由一个问题引发的。。。。。。。。。。。。。。。。。。。

来源:互联网 发布:懒人js特效 编辑:程序博客网 时间:2024/06/05 03:47

由*p++和*(p++)有什么区别??

这个问题跟i++和++i差不多,(*p)++,是先取指针P的值,然后对其值进行++运算,也就是对 指针指向的内容的值加1.如原来*p=&a=5,经过(*p)++之后&a=6了。

*(p++),也可以写成*p++,是先对指针P进行++运算,然后再取取值。这里就涉及到指针的类型了

  char :1个字节
      char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   4个字节
      long long:  8个字节
      unsigned long:  4个字节

  64位编译器:

      char :1个字节
      char*(即指针变量): 8个字节
      short int : 2个字节
      int:  4个字节
      unsigned int : 4个字节
      float:  4个字节
      double:   8个字节
      long:   8个字节
      long long:  8个字节
      
unsigned long:  8个字节

所以如果是在32位的系统上
char*p那么(*p)++就是在原来的字节上往高位移动1个字节,
short*p那么(*p)++就是在原来的字节上往高位移动2个字节,
int*p那么(*p)++就是在原来的字节上往高位移动4个字节,
float*p那么(*p)++就是在原来的字节上往高位移动4个字节,
long*p那么(*p)++就是在原来的字节上往高位移动4个字节,
double*p那么(*p)++就是在原来的字节上往高位移动8个字节.
但是特别注意如果是sizeof(p),那么无论是char*p,还是double*p,或者是int*p得到的都是4个字节。因为操作系统是32位的 32位是4个字节(一个字节八位)。

指针长度和地址总线有关。因为指针记录的就是一个地址,那么32位的就是4字节,64位的就是8字节,也正是地址总线的意义所在~

所以当char* pstr[] = { "ABCD","EFG" };
然后sizeof(pstr)=8; // 4*2=8因为sizeof(pstr)是求指针数组大小的,4*2 bytes 。。。

同理如果在64位操作系统里面那么sizeof(pstr)=16; // 8*2=16

未完待续。。。。。。。。。。。。。。。。。。。。。。

0 0
原创粉丝点击