zoukankan      html  css  js  c++  java
  • C语言关于数组地址的一些知识

    1 #include "stdio.h"
    2 
    3 int main()
    4 {
    5     int a[5]={1,2,3,4,5};
    6     int *ptr=(int *)(&a+1);
    7     printf("%d  %d
    ",*(a+1),*(ptr-1));
    8 }

    输出结果为:   2   5

    打印的第一个数好理解,就是打印的数组首地址加一后的数,就是a+1,打印的是2;

    打印的第二个数为什么是5呢?下面好好说一下:

       首先我们知道,C语言中的指针"+1",加的长度都是其类型的长度,比如 char 型,这个类型指针加一,所加的就是 1 个字节的长度,而 int 型所加的就是 个字节的长度,好,现在再来看上面的代码,我所定义的数组是 “int a[5]”,这是一个长度为5的数组,下面的 printf 中,第二个打印的为什么是5呢?那时因为 “ptr”指针所存放是"数组地址",是这个长度为5的数组的地址!换句话说,这是一个长度为“5个int型数据”的“类型”,他的指针加1,所加的是整个数组的长度!它加的是5,是5*4(int型4个字节)=20个字节的长度!所以这加1,其实直接加到了数组第5位元素,但是如果这是我们就这样打印ptr里面的内容,其实得到的是内存随机值,因为数组下标最大是4,而现在直接加到5了,所以应该再减1,这样才不会超出数组,这是减一后打印的数刚好就是5,减2就是4。。。。。

      下面总结一下最重要的结论:"数组下标加1"和"对数组取地址后加1"是不同的!数组下标直接加1,就是简单的从第一个元素的地址开始,往后加相应的1个地址,而如果对数组名取地址,这是加的就不是单单的往后加一个地址了,这时其实取的是数组的地址,这时的指针所加的也是整个数组的长度!

  • 相关阅读:
    get(0)??
    抽象类中。。
    matlab函数
    unity_快捷键
    unity_ UI
    关于博客园使用
    survival shooter
    第七次团队作业:Alpha冲刺(3/10)
    第七次团队作业:Alpha冲刺(2/10)
    第七次团队作业:Alpha冲刺(1/10)
  • 原文地址:https://www.cnblogs.com/data-base-of-ssy/p/6668061.html
Copyright © 2011-2022 走看看