• 数组名a,数组名取地址&a,数组首地址&a[0],数组指针*p


    1 解析不同变量之间的区别:

    数组名a:

    数组名a可以作为数组第一个元素的指针。我们由数组和指针的关系知道,a代表这个地址数值,它相当于一个指针,指向第一个元素(&a[0]),即指向数组的首地址。数组中的其他元素可以通过a的位移得到,此时的进阶是以数组中单个的元素类型为单位的,即a+i = &a[i]。

    数组名取地址&a:

    对于一个普通的变量b,&b是指用取地址符号取得变量b的存放地址;a在内存中没有分配空间,只对数组a的各个元素分配了存储空间,此处数组名字a显然不是普通的变量,&a也不代表所取a的存储地址。

    &a在数值上等于&a[0],也等于a。此时,&a数值上等于整个数组的起始位置地址,含义上代表整个数组所占内存的大小,因为它的进阶单位是整个数组的字节长度,(&a+1)等于的是数组结束之后的下一段的起始位置地址。

    数组首地址&a[0]:

    这个就是取地址的最直接的应用,a[0]在内存中实际存储空间,而&a[0]就是取该存储空间的地址,这与对于任意满足范围的i, &a[i]就是取第i个元素的存储地址一样。

    数组指针*p:指针是一个特殊的变量,它里面存储的数值被解释称为内存里的一个地址。经常用取地址符&将某个变量的地址赋给它,同时常常对指针用取值符号*取得对应地址的内容。

     2 关于字符类型数组的小插曲

    在C++语言环境下,把上述int类型的数组改成char类型的数组,结果就不一样了。

     2.1为什么只有&b,&c,&d能正确输出地址:

    在C语言里,输出一个字符串的指针很方便,直接 printf("%p ",p)就输出了。

    而在C++里cout太自作聪明了,为了省去我们循环输出字符的麻烦,cout<<p<<endl;被翻译为输出p指向的字符串值。

    依据之前讲的,只有&a是指向整个数组,而其他的都是指向某一个元素。于是都将以这些元素为起始位置,输出一个字符串。

    2.2为什么烫烫烫烫屯屯屯屯

    VC会把未初始化的栈内存全部填成0xcc,当字符串看就是 烫烫。。。

    会把未初始化的堆内存全部填成0xcd,当字符串看就是屯屯。。。

    参考:http://www.jeepxie.net/article/915242.html

  • 相关阅读:
    Silverlight4实现三维企业网站
    (学)Lazarus 字符串压缩、解压缩
    (原)Oracel 函数返回 Decimal 丢失小数位问题
    (原)如何提高软件运行速度
    (转) ORA01033: ORACLE 正在初始化或关闭
    (学)正在写一个陌生行业的方案,努力ing
    (学)Telerik GridFoot 如何加合计
    (思)爱的路上千万里
    (学)Telerik RadGridView 中Column 数据字段绑定
    写在2011年伊始
  • 原文地址:https://www.cnblogs.com/zhibei/p/12653454.html
Copyright © 2020-2023  润新知