zoukankan      html  css  js  c++  java
  • &a + 1和 &(a+1)

    问题来源:

    int a[5] = {1,2,3,4,5};
    int *b = (int *)(&a+1);
    cout<<*a<<endl<<*(a + 1)<<endl<<*(b-1)<<endl;


    最后输出是:

    1

    2

    5


    这里有个梗就是两种+1究竟背后是加了多少,这个关键是得知道是谁在+1:

    (1)a+1,a是一个指向一个int值的指针+1,所以+1背后实际是+ 1 * sizeof(int *),也就是 + 4bytes,也就是加了一个int的空间,最后自然a + 1的结果是 a[1] 的地址,所以*(a+1)的结果是a[1]的值2.

    (2)&a + 1,a是一个指向数组头元素(一个int)的指针,那么&a就是一个数组的指针,这个指针的单位是一个a[5]这么大的一个数组,所以后面的 + 1 变成了

     + 1 * sizeof(size为5的数组) = + 20bytes也就是5个int的空间,所以最后int *b = (int *)(&a + 1)得到的b是指向a[5]元素的地址的指针,直接*b取值(a[5])的话就导致数组越界了。

    (3)最后,b已经变成了一个指向a[5]元素的指针,也就是一个int指针,所以最后b -1 中的-1实际是 - 1 * sizeof(int) = - 4bytes,最后b - 1是指向了a[4]的地址,所以*(b-1)取的是a[4]的值。

    综上,两种不同的+1,关键在于是谁在+1,也就是被加者的单位或者说单元是什么,a + 1中a的单位是一个int指针(单位大小为4bytes)),&a + 1中单位是一个数组指针(单位大小为该数组的总bytes数,例如本例子中是20bytes),最后无论是+1还是+2还是+n,都只需要化成 + n * (sizeof(单位))。



  • 相关阅读:
    人不能乱说
    信息不可透露

    一波韭菜又一波韭菜,割了一波又一波
    截取等宽中英文字符串(比如截取2个,中午截取两个字,英文截取四个单词)
    nhibernate 配置nvarchar(max)
    angularjs 自带的过滤器
    检测是否是IE浏览器
    WebClient 使用
    从流获取缩略图
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586360.html
Copyright © 2011-2022 走看看