zoukankan      html  css  js  c++  java
  • 数组名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

  • 相关阅读:
    2021,6,10 xjzx 模拟考试
    平衡树(二)——Treap
    AtCoder Beginner Contest 204 A-E简要题解
    POJ 2311 Cutting Game 题解
    Codeforces 990G GCD Counting 题解
    NOI2021 SDPTT D2T1 我已经完全理解了 DFS 序线段树 题解
    第三届山东省青少年创意编程与智能设计大赛总结
    Luogu P6042 「ACOI2020」学园祭 题解
    联合省选2021 游记
    Codeforces 1498E Two Houses 题解 —— 如何用结论吊打标算
  • 原文地址:https://www.cnblogs.com/zhibei/p/12653454.html
Copyright © 2011-2022 走看看