zoukankan      html  css  js  c++  java
  • 指针

    #include<stdio.h>
    #include<stdlib.h>//malloc用来申请内存
    /*传参 申请堆内存
    变量内存存放  变量在内存中的地址 &
    指针作用  存放地址
    scanf("%d",&x);//修改x的值 传入x的地址
     
     类型*  指针变量名  一级指针  p存放int类型变量的地址
     int*p   指向int的指针类型  p存放int类型变量的地址
     一维数组  也可以用一级指针
     数组名  指针区别
      数组名  表示数组的首地址  数组名不可以修改(视为常量)
      指针课修改
      sizeof求大小  数组名 求数组的大小 指针 求指针的大小
      int arr[10]
      arr++ arr=
      数组名[下标]
      数组名和指针  都可以用* 都可以[]
      int *p;
      类型 变量名  p  类型  int*
    ------------------------------------------------------------
      指针  申请堆内存
      程序运行的时候  代码  数据  加载内存当中
      内存四区
       代码区   存放代码二进制
       全局静态常量区(全局静态区  常量区)
        全局在函数外定义变量 作用域整个程序
        静态 static 用他来修饰变量(存放在全局静态区)
       栈区  局部变量(函数  循环里面定义变量)形参
          都会存放在栈区
          栈区 小的空间  内存操作系统控制
           4M(字节位单位 是自动回收的)
       堆区 1G  自己去申请释放  需要用到函数专门申请内存malloc  realloc
          申请内存需要用到指针
         好处:大 坏处:自己去申请和释放 申请用到指针  用完记得释放
         realloc  内存重分配 (升级内存)
         void* 要强转才能使用
      传参   深入一点
      int 有int*  一级指针  保留int的地址
      int*p --> p也是变量 p也有地址  如果得到p的地址  定义二级指针来接受p的地址
      int** pp=&p;//二级指针
      *pp-->得到的是pp指向的内容  也就是p

      一维数组  传参  用一级指针
      二维数组  传参  数组指针
       int dArr[3][4];//二维数组
       int (*pd)[4];//数组指针

       对于[]  解引用的
       p[i]  *(p+i)
     */
    void fun(int arr[])//形参实际上是指针  int*arr
    {
     sizeof(arr[0]);//求的是形参的大小--->指针的大小
    }
    void fun2()
    {
     static int x = 0;
     ++x;
     printf("x=%d ", x);
    }
    void test()
    {
     int x = 2;
     int *p = &x;//p指向x
     int **pp = &p;//pp指向的是p
     printf("x=%d ", x);
     printf("p=%d ", p);
     printf("pp=%d ", pp);
     printf("x的地址%d ", &x);
     printf("p的地址%d ", &p);
     printf("%d", *pp);//相当于打印p存放的值 ----->x的地址
     printf("%d", **pp);
    }
    void fun3(int(*pd)[4])//int dArr[][4])
    {
     pd[2][3];//数组指针只有一个指针
    }
    int main()
    {
     fun2();
     fun2();
     fun2();
     test();
     int dArr[3][4];
     fun3(dArr);
     dArr[0][0]; dArr[0][1];
     dArr[0][4];
     int arr[100];//数组
     int brr[100000];
     fun(arr);
     int *p;//定义指针类型
     int a;
     p=&a;//指针p接受变量a的地址
     //实参给形参赋值
     //&a作为实参   然后  p作为形参
     *p;//运算符
     //需要存放100个int
     int *q = (int*)malloc(sizeof(int)*10000);//申请100个int大小的sizeof(int)*100这一块只是大小不是决定你存什么数据
     //需要使用  就需要用指针去保留这块内存的首地址
     //malloc 返回值 申请的内存首地址( 内存是堆的内存)是void*类型 表示任意类型的指针
     //赋值需要强转 只负责申请内存 不管你在里面存什么内容

     if (q == NULL)
     {
      printf("申请失败 ");
      getchar();
      return 0;
     }
     //q指向了这块空间的首地址
     
     *q=12;
     *(q + 1) = 13;
     q[2] = 14;
     q[3] = 15;
     for (int i = 0; i < 4; ++i)
     {
      printf("%d ", q[i]);
     }
     q = (int*)realloc(q, sizeof(int)* 200);//把之前100个int  扩充到200
     //  把之钱..内存 扩充到这么大 在释放之前进行操作 用realloc来扩充内存
     printf("重新分配之后 ");
     for (int i = 0; i < 4; ++i)
     {
      printf("%d ", q[i]);
     }
     printf("q的值%p ", q);//%p是打印地址的格式符
     //printf("%d", sizeof(q));
     free(q);//释放内存 用完之后一定要进行释放
     printf("q的值%p ", q);
     //内存已释放  q指向的空间就不要访问
     //虽然q还是指向这个空间 已经还回去了  你再用就会出问题;
     //*q = 12;//释放之后就不要再用
     getchar();
     return 0;
    }
  • 相关阅读:
    声明
    Random类——获取随机数
    JDK_API的使用方法
    Ajax?有谁开始学习了吗?
    用xslt循环xml同一节点的不同子节点
    在Repeater控件中嵌套一个Repeater控件
    html+css的一些技巧.收集中...
    记录一下: onbeforeunload()方法, 避免未保存而关闭页面.
    简单的C# Socket编程
    不实用的UriBuilder类
  • 原文地址:https://www.cnblogs.com/liugangjiayou/p/10540017.html
Copyright © 2011-2022 走看看