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的位置

  • 相关阅读:
    SQL---一次插入多条数据【使用Union】
    SQL--联合查询【Union】
    也说梦想----2015年终总结
    csharp: Procedure with DAO(Data Access Object) and DAL(Data Access Layer)
    csharp:Nhibernate Procedure with CreateSQLQuery and GetNamedQuery
    csharp: Domain-Driven Design(领域驱动设计)
    csharp:VerifyCode in winform or webform
    csharp: DBNull and DateTime
    csharp: DataRelation objects to represent a parent/child/Level relationship
    csharp: .NET Object Relationional Mapper (ORM)- SubSonic
  • 原文地址:https://www.cnblogs.com/zhaiyf/p/8549435.html
Copyright © 2011-2022 走看看