zoukankan      html  css  js  c++  java
  • 指针 与 数组 以及 a 与 &a的区别

      指针 与数组 并没有什么关系,
     
    指针就是指针,指针变量在32位系统下,永远占4个byte,其值为某一个内存的地址,指针可以指向任何地方,但是不是任何地方你都能通过这个指针变量访问到;
     
    数组就是数组,其大小与元素的类型和个数有关,定义数组时必须指定其元素的类型和个数,数组可以存储任何类型的数据,但是不能存放函数;;
     
    char *p = "abcdef"; // "abcdef" 放在静态区;
    1) 以指针的形式:*(p+4) 这种形式先取出p存储的地址值,然后在加上4个字符的偏移量,得到新的地址,然后取出这个新的地址上的值:
    2) 以下标的形式: p[4] .  编译器总是把以下标的形式的操作解析为以指针的形式的操作。p[4]这个操作会被解析成:先取出p存储的地址值,然后在加上4个字符的偏移量,得到新的地址,然后取出这个新的地址上的值:   
             两种方式在本质并没有什么区别,只是写法上的不同; 
     
     
    a 与 &a 的区别;;

     
     
           int a[5] = { 1, 2, 3 ,4 ,5};
     
           int *ptr = (int *)(&a+1);             // 1 + sizeof(a)    ?20byte?
           printf("%d  %d " ,*(a+1) , *( ptr-1)); //  1 sizeof(a[0]) ; //
     
         对指针进行加1操作,得到的是下一个元素的地址,而不是原有地址值直接加1,所以一个类型为T的指针的移动,以sizeiof(T)为移动单位
         &a+1:  去数组a的首地址,该地址的值加上sizeof(a)的值,即 &a+5*sizeof(int),也就是下一个数组的首地址,显然当前指针已经越过了数组的界限;;
         (int *)(&a+1): 将越出数组的地址,强制转化为 int* 类型,赋值给ptr;
         *(a+1):   a 与 &a 的值是一样的,但意思不一样,a是数组首元素的首地址,也就是a[0]的首地址, &a是数组的首地址。 
           a+1是数组下一元素的首地址,即a[1]的首地址,    所以输出2;;//   
           &a+1是下一个数组的首地址,   //
     
  • 相关阅读:
    数据库 第一、二、三范式
    JVM垃圾回收(GC)整理总结学习
    ConcurrentHashMap
    Java GC、新生代、老年代
    Android -- 查看手机中所有进程
    ThreadLocal
    Android -- DrawerLayout
    WeakReference与SoftReference
    ASP.NET Core Web服务器 Kestrel和Http.sys 特性详解
    微服务架构体系
  • 原文地址:https://www.cnblogs.com/vagabond/p/4996325.html
Copyright © 2011-2022 走看看