zoukankan      html  css  js  c++  java
  • C++数组名解析

    首先看下面程序:

    #include <iostream>
    using namespace std;

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

    return 0;
    }

    运行结果:

    0012FF6C
    0012FF6C
    0012FF70
    0012FF80

    解析:(1)a是数组名,代表数组第一个元素地址,a+1是数组第二个元素的地址。

            (2)&a是表示取整个数组的地址,&a+1代表示一次移动一个数组长度。

    再看一道经典的面试题:

    #include <iostream>
    using namespace std;

    int main()
    {
    int a[5]={1,2,3,4,5};
    int *ptr1=(int*)(&a+1);
    int *ptr2=(int*)((int)a+1);

    cout<<ptr1[-1]<<"\t"<<*ptr2<<endl;

    return 0;
    }

    运行结果
    5       33554432

    即十六进制输出结果:5       2000000

    解析:(1)&a+1数组最后元素的下一个地址,所以ptr1[-1]相当于*[ptr-1]即5。

            (2)(int)a+1,因为强制转换运算符高于算术运算符,所以相当于((int)a)+1;(int)a就是将数组的第一个元素的地址转换为整数类型,

                (3)大小端存储模式。

    大端模式:字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。

    小端模式:字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。

    显然这里采取的小端模式。

    参考:

    (1)《高质量程序设计指南 —C++/C语言》 林锐编著

    (2)http://www.cnblogs.com/loogn/archive/2012/01/16/2323952.html

    (3)http://blog.csdn.net/seton040/article/details/4764935

     

             

  • 相关阅读:
    装饰器的进阶
    Django admin组件应用
    AJAX
    Cookie、Session和自定义分页
    Django中ORM介绍和字段及字段参数
    Django 框架
    Django之视图
    Django之路由系统
    Django ORM相关操作
    Django 模板语言
  • 原文地址:https://www.cnblogs.com/danshui/p/2393606.html
Copyright © 2011-2022 走看看