• 指针的初步认识


    #include <stdio.h>
    int main()
    {
        //显示变量的地址
        //指针是一个特殊的变量,存储的地址
        int i = 0;
        printf("0x%p
    ",&i);
        //上面中的%p,指的是printf中以输出地址的占位符
        //&i,表示取指针,返回一个指向i的int类型指针,它存储的值是i的地址
    
        {
             printf("%i
    ",&i);
             //%i  ,表示以十进制输出地址
            //会报两个警告,说类型不匹配
            //warning: format '%i' expects argument of type 'int',  but argument 2 has type 'int *' [-Wformat=]
        }
    
        return 0;
    }
    
    
    #include <stdio.h>
    int main()
    {
        int i=0;
        int *p;           //声明一个指针变量,* 用来说明该变量是一个指针
        p=&i;           //把i的地址赋值给指针p,也就是说p存了指向i的地址
        printf("&i=%p
    ",&i);
        printf("p=%p
    ",p);    //&i=000000000061FE14
                                           //p=000000000061FE14
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //通过指针进行读取
        int i = 9;
        int *p;
        p = &i;
        printf("%d
    ",*p);      // * 指针运算符,指的是取它后面指针所指向的值   p是指针,存储着指向i的地址
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //通过指针对变量进行修改
        int i = 8;
        int *p = &i;
        printf("i=%d
    ",i);
        printf("*p=%d
    ",*p);
        *p=7;
        printf("i=%d
    ",i);
        printf("*p=%d
    ",*p);
        i=6;
        printf("i=%d
    ",i);
        printf("*p=%d
    ",*p);
        return 0;
    }
    
    i=8
    *p=8
    i=7
    *p=7
    i=6
    *p=6
    
    #include <stdio.h>
    int main()
    {
        //野指针
        int *p;
        printf("%p",p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //野指针
        int *p;
        printf("%p",p);
        *p=0;
        int *pInt=0;
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //更新指针保存的地址
        int i=10;
        int j=20;
        int *p=&i;
        printf("i的地址:%p
    ",&i);
        printf("j的地址:%p
    ",&j);
        printf("p保存的地址:%p
    ",p);
        p=&j;
        printf("更改后地址
    ");
        printf("i的地址:%p
    ",&i);
        printf("j的地址:%p
    ",&j);
        printf("p保存的地址:%p
    ",p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针自身的地址
        int i=10;
        int *p=&i;
        printf("p的地址:%p
    ",&p);
        printf("p保存的地址:%p
    ",p);
        printf("p指向的变量的值:%d
    ",*p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针的加减运算
        int i=10;
        int *p=&i;
        printf("指针p保存的地址为%p
    ",p);
        p++;
        printf("自加后,指针p保存的地址为%p
    ",p);
        p--;
        printf("自减后,指针p保存的地址为%p
    ",p);
        p-=2;
        printf("减2后,指针p保存的地址为%p
    ",p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针的赋值运算
        int i=10;
        int j=20;
        int *p1=&i;
        int *p2=&j;
        printf("p1=%p	p2=%p
    ",p1,p2);
        p1=p2;
        printf("p1=%p	p2=%p
    ",p1,p2);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针的相减运算
        int i=10;
        int j=20;
        int *p1=&i;
        int *p2=&j;
        printf("p1=%p
    ",p1);
        printf("p2=%p
    ",p2);
        *p1=p1-p2;
        printf("p1-p2=%d
    ",*p1);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针的相减运算
        int i=10;
        int j=20;
        int *p1=&i;
        int *p2=&j;
        printf("p1=%p
    ",p1);
        printf("p2=%p
    ",p2);
        if(p1>p2)
            printf("p1的地址p2地址大
    ");
        else
            printf("p2的地址比p1地址大
    ");
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指针的类型
        char ch;
        int i;
        char *pCh=&ch;
        int  *pInt=&i;
        printf("pCh保存的地址为:%p
    ",pCh);
        pCh++;
        printf("自加后,pCh保存的地址为:%p
    ",pCh);
        printf("pInt保存的地址为:%p
    ",pInt);
        pInt++;
        printf("自加后,pInt保存的地址为:%p
    ",pInt);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //常量指针
        int i=0;
        int *const p=&i;
        //p++;//指针不可修改
        *p=1;
        i++;
        printf("i=%d
    ",*p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指向常量的指针
        int i=0;
        const int *p=&i;
        printf("*p=%d
    ",*p);
        p++;
        //*p=1; 指针指向的是常量,不能修改
        printf("*p=%d
    ",*p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指向常量的常指针
        int i=0;
        const int *const p=&i;  //int const *p
        printf("*p=%d
    ",*p);
        //p++;   //指针是常量,不能修改  
        //*p=1; //指针指向的是常量,不能修改
        printf("*p=%d
    ",*p);
        return 0;
    }
    
    #include <stdio.h>
    int main()
    {
        //指向常量的常指针
        int i=0;
        int const *p=&i;  //int const *p
        printf("*p=%d
    ",*p);
        p++;   //
        //*p=1; //指针指向的是常量,不能修改
        printf("*p=%d
    ",*p);
        return 0;
    }
    
  • 相关阅读:
    python基础简记
    关于cmake找不到库的问题
    【STM32H7教程】第92章 STM32H7的FDCAN总线应用之双FDCAN实现(支持经典CAN)
    《安富莱嵌入式周报》第237期:2021.10.25--2021.10.31
    【STM32H7教程】第91章 STM32H7的FDCAN总线基础知识和HAL库API
    【STM32H7教程】第90章 STM32H7的CAN FD总线之关键知识点整理
    【STM32H7教程】第89章 STM32H7的CAN FD总线基础之前世今生
    embOS推出一个RTOS的革命性功能,支持微秒和CPU时钟周期级分辨率的任务调度和API延迟参数设置
    【不是问题的问题】为什么STM32的Flash地址要设置到0x08000000
    《安富莱嵌入式周报》第236期:2021.10.18--2021.10.24
  • 原文地址:https://www.cnblogs.com/delongzhang/p/14773686.html
Copyright © 2020-2023  润新知