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个地址,而如果对数组名取地址,这是加的就不是单单的往后加一个地址了,这时其实取的是数组的地址,这时的指针所加的也是整个数组的长度!

  • 相关阅读:
    vue路由传参页面刷新参数丢失问题解决方案
    理解MVC,MVP 和 MVVM
    HTTPS用的是对称加密还是非对称加密?
    元素显示隐藏的9种思路
    CSS中层叠上下文
    DOM盒模型和位置 client offset scroll 和滚动的关系
    css重点知识和bug解决方法
    你可能不知道的CSS
    如何在 React 中优雅的写 CSS?
    html5不常用标签应用场景
  • 原文地址:https://www.cnblogs.com/data-base-of-ssy/p/6668061.html
Copyright © 2011-2022 走看看