• 学点 C 语言(20): 数据类型 指针



    1. 通过 &变量 可以获取变量地址:
    #include <stdio.h>
    
    int main(void)
    {
        int num = 10;
    
        printf("变量值: %d\n", num);
        printf("变量址: %d\n", &num);
    
        getchar();
        return 0;
    }
    

    2. 表示变量地址的变量就是指针:
    #include <stdio.h>
    
    int main(void)
    {
        int num = 10;
        int *p = #
    
        printf("%d, %p\n", num, p);
        
        getchar();
        return 0;
    }
    

    3. *指针 就如同变量本身是一样的:
    #include <stdio.h>
    
    int main(void)
    {
        int num = 10;
        int *p = #
    
        printf("%d, %p, %d\n", num, p, *p);
    
        *p = 11;
        printf("%d, %p, %d\n", num, p, *p);
    
        (*p)++;
        printf("%d, %p, %d\n", num, p, *p);
    
        num = 99;
        printf("%d, %p, %d\n", num, p, *p);
        
        getchar();
        return 0;
    }
    

    4. 声明指针时要注意初始化, 没有初始化的指针是危险的:
    #include <stdio.h>
    
    int main(void)
    {
        int n1 = 11;
        int n2 = 22;
        int *p = NULL; /* 初始化为空 */
    
        p = &n1;
        printf("%d, %p, %d\n", n1, p, *p);
    
        p = &n2;
        printf("%d, %p, %d\n", n2, p, *p);
    
        getchar();
        return 0;
    }
    

    5. 为什么没有初始化的指针是危险的:
    #include <stdio.h>
    
    int main(void)
    {
        int *p;
    
        // 上面的指针 p 没有初始化话, 但它也有个垃圾地址
        printf("%p\n", p);
    
        // 此时如果给它赋值, 谁知道会覆盖了什么?
        //*p = 100;  /* 不要执行这个 */
    
        getchar();
        return 0;
    }
    

    6. 指向常量的指针: 不能通过指针修改它指向的值, 但该值可以通过其变量修改
    #include <stdio.h>
    
    int main(void)
    {
        int n1 = 111;
        int n2 = 222;
        const int *p = &n1;  /* 注意 const 的使用 */
    
        printf("%d, %p, %d\n", n1, p, *p);
    
        n1 = 333;
        //*p = 333; /* 不可以这样, 因为现在的指针是常量 */
        printf("%d, %p, %d\n", n1, p, *p);
    
        p = &n2;    /* 可以改变指针的指向 */
        printf("%d, %p, %d\n", n2, p, *p);
    
        getchar();
        return 0;
    }
    

    7. 常量指针: 锁定指针的指向
    #include <stdio.h>
    
    int main(void)
    {
        int n1 = 111;
        int n2 = 222;
        int *const p = &n1; /* 注意 const 的使用 */
    
        printf("%d, %p, %d\n", n1, p, *p);
    
        n1 = 333;
        //*p = 333; /* 不可以这样, 因为现在的指针是常量 */
        printf("%d, %p, %d\n", n1, p, *p);
    
    //    p = &n2;    /* 现在不可以改变指针的指向了 */
    //    printf("%d, %p, %d\n", n2, p, *p);
    
        getchar();
        return 0;
    }
    

    8. 指针是有类型的:
    #include <stdio.h>
    
    int main(void)
    {
        long   n    = 100L;
        float  f    = 1.5f;
        double d    = 3.14159265;
        
        long   *p1   = &n;
        float  *p2   = &f;
        double *p3   = &d;
    
        printf("%ld\n", *p1);
        printf("%g\n",  *p2);
        printf("%.8f\n",*p3);
    
        getchar();
        return 0;
    }
    

    9. 令人迷惑的指针定义:

    到底应该怎样写:
    int *p;
    int * p;
    int* p;

    因为 C 语言忽略空白, 这些都是对的, 但下面的例子会说明哪个更好:
    #include <stdio.h>
    
    int main(void)
    {
        int n1, n2, *p; /* 定义了两个整数(n1、n2), 和一个整数指针(p) */
    
        n1 = 111;
        n2 = 222;
    
        p = &n1;
        printf("%d, %p\n", *p, p);
    
        p = &n2;
        printf("%d, %p\n", *p, p);
        
        getchar();
        return 0;
    }
    

  • 相关阅读:
    UDP案例_在线咨询
    MFC对话框水平和垂直滚动条功能
    对话框中滚动条
    ON_COMMAND_RANGE 多个按钮响应一个函数
    char**赋值
    MFC如何使dialog对话框置顶
    如何让CListBox控件滚动条自动向下滚动?
    不带,以及带参数,带返回值的Lambda表达式
    JAVA学习_多线程技术
    最烦有些技术帖上来就放代码
  • 原文地址:https://www.cnblogs.com/del/p/1342542.html
Copyright © 2020-2023  润新知