zoukankan      html  css  js  c++  java
  • C++ 对数组sizeof 和对数组元素sizeof

    这一段程序

    下面这段程序很有看点:
    //arr1 is an array of ints
    int *source=arr1;
    size_t sz=sizeof(arr1)/sizeof(*arr1);//number of elements
    int *dest=new int[sz];
    while(source!=arr1+sz)
        *dest++=*source++;//copy element and increment pointers

    1.source是一个指向数组arr1的第一个元素的指针.(开始时,*source与*arr1的值是一样的.)

    2.sizeof操作符的作用是返回一个对象或类型名的长度,返回值类型为size_t,长度的单位是字节.

    3.对数组做sizeof操作等效于将对其元素类型做sizeof操作的结果乘上数组元素的个数.因为sizeof返回整个数组在内存中的存储长度.

    4.sizeof(*arr1),对指针arr1做sizeof操作,返回arr1所指的数组的第一个int型元素的类型长度.在这里,下面三种写法是等效的:

    sizeof(*arr1)=sizeof(*source)=sizeof(int)

    5.source!=arr+sz,这里是在比较地址(没有解引用),这里的数组名arr就自动转化成了指向数组第一个元素的指针,加几就指向其后面的第几个元素.

    6.比较sizeof(arr1)和sizeof(*arr1).arr1不解引用做sizeof操作,编译器能判断出来这就是一个普通的指针还是一个数组名指针,如果这是个数组名,就返回整个数组在内存中的存储长度,否则就返回存放指针所需的内存大小,比如指针p里存放的地址是0x22ff50,那么存放这个地址需要4字节,则sizeof(p)返回4.而对于*arr1,这里arr1只是一个普通的指针.

    -------------------------------

    猜想

    继续研究上面的第六点,写了这样一段测试程序:

        char a[7]={'1','2','3','4','5','6','7'};
        char *b=&a[0];
        char *c=a;
        cout<<sizeof(a)<<endl;
        cout<<sizeof(a+2)<<endl;
        cout<<sizeof(b)<<endl;
        cout<<sizeof(c)<<endl;

    输出的结果为:

    7

    4

    4

    4

    那么,我想,或许真有数组名指针这种东西,也就是说指针a上可能有某种记号表明它是一个数组名,这种标志是数组创建的时候产生的,另一种可能就是指针a和7个数组元素存放的地址存在某种特殊联系.

  • 相关阅读:
    Scala Ant Tasks
    Git挂钩
    读写文件
    DC10用CSS定位控制网页布局
    table设置colspan属性,列宽显示错位解决方法
    ATM和购物商城-错题集
    python 函数参数多种传递方法
    python 函数 初学
    python 集合 gather
    元组 字体高亮 购物车练习
  • 原文地址:https://www.cnblogs.com/qiri07/p/4812961.html
Copyright © 2011-2022 走看看