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(单位))。



  • 相关阅读:
    基于 .NET Core 的简单文件服务器
    重启博客园,走出第一步
    layui扩展组件zTreeSelectM,下拉树多选
    skyline加载arcgis发布的wms服务
    HTML&CSS:构建网站不能不说的那些事儿
    VueCLi3 配置less变量
    Bootstrap4 本地编译运行
    冒泡排序和选择排序
    Router
    ToDoList
  • 原文地址:https://www.cnblogs.com/lvlang/p/10586360.html
Copyright © 2011-2022 走看看