• 指针


    #include "stdio.h"
    #include "stdlib.h"
    #include "string.h"
    
    // void get(int a)
    // {
    //  a = 20;
    //  printf("%d
    ", a);
    // }
    // void (*FUNP)(int a);
    // void get1(int *a)
    // {
    //  *a = 30;
    // }
    // void ChangePa(int ** a)
    // {
    //  int cc = 100;
    //  *a = &cc;
    // }
    void main()
    {
    // int a = 10;//申请一块内存 命名a 并存放整型20
    // int *pa;//定义一个指向整型的指针pa
    // pa = &a;//指针pa赋值为a的内存地址,改指针可变
    // printf("address:%p,value:%d.
    ", pa,*pa);//pa即为a地址,*pa查找该地址的值
    // printf("address:%p,value:%d.
    ", &a,a);//a的地址,a的值
    ////////////////////////////////
    // address:0060FF28,value:10. //
    // address:0060FF28,value:10. //
    ////////////////////////////////
    
    // *pa = 20;//通过指针改变内存的值
    // printf("address:%p,value:%d.
    ", pa,*pa);//pa即为a地址,*pa查找该地址的值
    // printf("address:%p,value:%d.
    ", &a,a);//a的地址,a的值
    ////////////////////////////////
    // address:0060FF28,value:20. //
    // address:0060FF28,value:20. //
    ////////////////////////////////
    
    // a = 30;//通过变量改变内存的值
    // printf("address:%p,value:%d.
    ", pa,*pa);//pa即为a地址,*pa查找该地址的值
    // printf("address:%p,value:%d.
    ", &a,a);//a的地址,a的值
    // //////////////////////////////
    // address:0060FF28,value:30. //
    // address:0060FF28,value:30. //
    // //////////////////////////////
    
    //数组遍历
    // int a[] = {1,2,3};
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",a+i,*(a+i));
    // }
    ///////////////////////////////
    // address:0060FF1C,value:1. //
    // address:0060FF20,value:2. //
    // address:0060FF24,value:3. //
    ///////////////////////////////
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",a+i,a[i]);
    // }
    ///////////////////////////////
    // address:0060FF1C,value:1. //
    // address:0060FF20,value:2. //
    // address:0060FF24,value:3. //
    ///////////////////////////////
    ///以上两种方法遍历的结果和作用是一样的
    
    //指针遍历
    // int *pa,a[] = {1,2,3};
    // pa = a;
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",a+i,*(a+i));
    // }
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",pa+i,*(pa+i));
    // }
    ///////////////////////////////
    // address:0060FF18,value:1. //
    // address:0060FF1C,value:2. //
    // address:0060FF20,value:3. //
    // address:0060FF18,value:1. //
    // address:0060FF1C,value:2. //
    // address:0060FF20,value:3. //
    ///////////////////////////////
    ///打印的结果完全一样 就是说数组名本来就是个指针
    // ----------区别------------
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",pa,*pa);
    //  pa++;
    // }
    ////////////////////////////////
    // address:0060FF1C,value:1. //
    // address:0060FF20,value:2.  //
    // address:0060FF24,value:3.  //
    ////////////////////////////////
    ///可以正常遍历
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%d.
    ",a,*a);
    //  a++;
    // }
    //编译失败
    //原因在于数组名是个指针常量 不能够改变a++操作想要改变a内存的值 所以编译失败了。而指针pa是个变量,可以改变,所以能够正常编译和遍历
    
    //申明指针常量 (数组a的名称是个指针常量,那么如何正式定义一个指针常量?)
    // int a[] = {1,2,3};
    // int * const pa= a;
    // printf("%d
    ", *(pa+1));//2
    // printf("%d
    ", *(pa++));//指针常量不能改变 编译失败
    
    // const int a 和 int const a 是等价的,无论int还是const在前效果都一样
    // const int *pa 和 int const *pa 也是等价的,无论int还是const在前效果都一样
    //const int * pa/int * const pa的区别
    //---------------------const int * pa---------------
    // int a = 10;
    // printf("address:%p,value:%d.
    ",&a,a);// address:0060FF28,value:10.
    // int b = 20;
    // printf("address:%p,value:%d.
    ",&b,b);//address:0060FF24,value:20.
    // int const *p = &a;//初始化p指针为a的内存地址
    // printf("address:%p,value:%d.
    ",p,*p);//address:0060FF28,value:10.
    // p = &b;//可用过改变p指针 重新导向b的内存地址
    // b = 30;//改变b值
    // printf("address:%p,value:%d.
    ",p,*p);//address:0060FF24,value:30.
    // *p = 40;//通过*p来重新赋值则编译失败 因为*p是个常量 不能被改变
    //---------------------int * const pa---------------
    // int a = 10;
    // printf("address:%p,value:%d.
    ",&a,a);//address:0060FF28,value:10.
    // int b = 20;
    // printf("address:%p,value:%d.
    ",&b,b);//address:0060FF24,value:20.
    // int * const p = &a;//初始化p指针为a的内存地址
    // printf("address:%p,value:%d.
    ",p,*p);//address:0060FF28,value:10.
    // *p = 30;//通过*p来重新赋值 改变了a内存的值
    // printf("address:%p,value:%d.
    ",p,*p);//address:0060FF28,value:30.
    // p = &b;//改变p指针则编译失败 因为p是个指针常量 不能被改变
    //--------------------总结--------------------
    /////////////////////////////////////////////////////
    //const *p 表示*p是个常量 不能通过*p改变内存的值; //
    //* const p 表示p是个指针常量 不能重新赋值改变p;  //
    /////////////////////////////////////////////////////
    //补充三种情况
    //-----------------int *指针指向常量-----------------
    // const int a = 10;
    // int *pa = &a;//编译错误 因为pa不能够修改常量a的值
    // int *pa=(int* ) &i1;//强制转换再赋值 报错 不能修改
    // *pa = 100;//报错 不能修改
    //-----------------const int *指针指向常量-----------------
    // const int a = 10;
    // int const *pa = &a;//可以
    //-----------------const int * const指针指向常量-----------------
    // const int a = 10;
    // int const * const pa = &a;//可以 但是pa指针啥都不能做了~~~没有任何意义
    
    //函数指针(函数名和数组名一样 也是指针)
    // int a = 10;
    // printf("address:%p,value:%d.
    ",&a,a);//address:0060FF2C,value:10.
    // get(a);
    // printf("address:%p,value:%d.
    ",&a,a);//address:0060FF2C,value:10.
    // get1(&a);
    // printf("address:%p,value:%d.
    ",&a,a);//address:0060FF2C,value:30.
    // FUNP = &get;
    // (*FUNP)(a);//都是调用get()
    // FUNP(a);//都是调用get()
    // (*get)(a);//都是调用get()
    // get(a);//都是调用get()
    // printf("address:%p,value:%d.
    ",&a,a);//address:0060FF2C,value:30.
    
    //方法改变指针的地址和值
    // int *pa,a = 10;
    // printf("address:%p,value:%d.
    ",&a,a);
    // pa = &a;
    // ChangePa(&pa);//要改变指针的值 通过传入指针的地址 在方法内部进行*Pa赋值指针操作
    // printf("address:%p,value:%d.
    ",pa,*pa);
    
    //字符串指针
    // char c[] = "asd";
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%c.
    ",c+i,*(c+i));
    // }
    ///////////////////////////////
    // address:0060FF28,value:a. //
    // address:0060FF29,value:s. //
    // address:0060FF2A,value:d. //
    ///////////////////////////////
    
    // char c[] = {'a','s','d'};
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%c.
    ",c+i,*(c+i));
    // }
    ////////////////////////////////
    // address:0060FF29,value:a.  //
    // address:0060FF2A,value:s.  //
    // address:0060FF2B,value:d.  //
    ////////////////////////////////
    
    ///
    // char c[3][3] = {{'a','s','d'},{'a','s','d'},{'a','s','d'}};
    // for (int i = 0; i < 3; ++i)
    // {
    //  for (int j = 0; j < 3; ++j)
    //  {
    //  printf("address:%p,value:%c.
    ",&c[i][j],c[i][j]);
    //  }
    // }
    ///////////////////////////////
    // address:0060FF1F,value:a. //
    // address:0060FF20,value:s. //
    // address:0060FF21,value:d. //
    // address:0060FF22,value:a. //
    // address:0060FF23,value:s. //
    // address:0060FF24,value:d. //
    // address:0060FF25,value:a. //
    // address:0060FF26,value:s. //
    // address:0060FF27,value:d. //
    ///////////////////////////////
    
    // char *a[] ={"asdasd","asdasd","ascasd"};
    // for (int i = 0; i < 3; ++i)
    // {
    //  printf("address:%p,value:%s.
    ",a+i,*(a+i));
    // }
    /////////////////////////////////////
    // address:0060FF20,value:asdasd.  //
    // address:0060FF24,value:asdasd.  //
    // address:0060FF28,value:ascasd.  //
    /////////////////////////////////////
    
    }
  • 相关阅读:
    Spring基础学习
    云服务器配置java环境
    Struts2学习笔记(一)--入门常见配置
    Hibernate学习笔记(二)
    Hibernate学习笔记(一)
    java---Listener & Filter知识点学习
    java----DBUtils知识点补充
    java----连接池C3p0使用的补充
    IOS之表视图单元格删除、移动及插入
    IOS之表视图添加索引
  • 原文地址:https://www.cnblogs.com/godehi/p/13087352.html
Copyright © 2020-2023  润新知