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

  • 相关阅读:
    signalr推送消息
    WebApi2跨域问题
    iTextSharp生成pdf的一个简单例子
    遇到的错误记录
    AutoMapper用法
    visual studio 2015中的webapi生成helpPage,页面不显示方法说明问题解决
    visualstudio 2013 mysql entityframework :实体模型无法添加,闪退
    webapi相关知识
    2016年4月14日
    2016年4月13日
  • 原文地址:https://www.cnblogs.com/data-base-of-ssy/p/6668061.html
Copyright © 2011-2022 走看看