zoukankan      html  css  js  c++  java
  • C++中数组名和指针的区别联系

    原文:http://www.cnblogs.com/ddx-deng/archive/2012/12/16/3755862.html

    第一个结论:

    #include "iostream.h"
    void main()
    {
    1、 char str[]="abcdef";
    2、int n[]={1,2,3,4,5};
    3、char *p=str;//
    4、 cout<<sizeof(str)<<endl;一个字母在内存中占一个字节,这里输出7,7个字节但是6个字母,原因是字符串后面有一个‘’结束符,也占一个字节
    5、cout<<sizeof(n)<<endl;一个int数据在内存中占用4个字节,输出4*5=20
    6、cout<<sizeof(p)<<endl;输出4

    7、p++;

    8、str++;
    }

    7

    20

    4

    看似指针和数组名是相同的,其实不然;第4行和第6行输出结果不同就是证明,前者是字符数组长度7,而指针在32位机中是一个DWORD,4个字节,在64位中就是8了。

    第二个结论:

    第8句存在的话会编译报错,也就是数组名不能自加和自减,而指针可以。

    (1)数组名的内涵在于其指代实体是一种数据结构,这种数据结构就是数组;//************这才是实质

    (2)数组名的外延在于其可以转换为指向其指代实体的指针,而且是一个指针常量;//********code

    (3)指向数组的指针则是另外一种变量类型(在WIN32平台下,长度为4),仅仅意味着数组的存放地址!//********code

    第三个结论:数组名失去原本内含,沦为指针。可以做自增自减操作。

    #include "iostream.h"
    void Fun(char str[]);
    void main()
    {
    1、 char s[6];
     2、 Fun(s);
    }
    void Fun(char str[])
    {
       cout<<sizeof(str)<<endl;
    }

    第2句的结果不再是6,而是指针大小4.

    分析一个别人提问的例子:

    #include "iostream.h"
    void main()
    {
    int a[]={1,2,3,4,5};
    int *ptr=(int *)(&a+1);//&a是不是取地址,还是引用?
    cout<<*(ptr-1)<<endl;
    cout<<*(ptr)<<endl;
    }

    最终输出结果:5.

    解释1:a是一个数组名,上面说的,数组是一个数据结构;并且a已经能代表数据结构(本数组)的地址了,于是&a是对数据结构取地址,取得的地址+1会怎么样?会指向下一个数据结构,但是这里只有一个数据结构。。。那么int *ptr=(int *)(&a+1);执行后ptr指向数据结构(int[5]的数组)的结束,a是数组,&a 就是指向数组的指针,&a+1所以位移5个int,*(ptr-1)又是int* 反位移1个,5-1=4,位移4位就是第五个数


    解释2:a是一个int[5]类型,所以&a+1就会到数组末尾,再减1就是5的位置

  • 相关阅读:
    matplotlib 可视化 —— matplotlib.patches
    Ansi,UTF8,Unicode,ASCII编码的差别
    java.lang.Runnable接口
    wikioi 1051哈希表
    具体解释协方差与协方差矩阵
    基于Android Fragment功能的样例
    大学让我们坠落
    FFTW库+VS2012配置
    Ubuntu下安装eclipse
    SoftReference
  • 原文地址:https://www.cnblogs.com/zhaiyf/p/8549435.html
Copyright © 2011-2022 走看看