• C++学习(3)


    一、指针的基本概念

    首先指针是用来存放的地址,并不是值,所以最开始学习C的时候总有那么一句话,指针就是地址。
    据个例子:

    #include 
    
    using namespace std;
    
    int main ()
    {
       int  var1;
       char var2[10];
    
       cout << "var1 变量的地址: ";
       cout << &var1 << endl;
    
       cout << "var2 变量的地址: ";
       cout << &var2 << endl;
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述

    二、指针所占用的空间

    因为指针的是一个内存,所以我们规定:
    在32位操作系统下,无论什么类型的指针都占用4个字节
    在64位操作系统下,无论什么类型的指针都占用8个字节

    
    #include 
    
    using namespace std;
    
    int main ()
    {
        int a = 10;
        int *p = &a;
    
        cout << "指针占用的大小为:" << sizeof(p) << endl;
        cout << "int 指针占用的大小为:" << sizeof(int *) << endl;
        cout << "char 指针占用的大小为:" << sizeof(char *) << endl;
        cout << "double 指针占用的大小为:" << sizeof(double *) << endl;
        cout << "float 指针占用的大小为:" << sizeof(float *) << endl;
    
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    在这里插入图片描述

    我们操作系统是64位的,所以都是8个字节。

    三、空指针和野指针

    空指针无法进行访问
    空指针是指向内存为0的地址

    #include 
    
    using namespace std;
    
    int main ()
    {
        //空指针,无法访问
        int *p = NULL;
    
        *p = 100;
    
       return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    他的编译是不会报错的,因为你的语法是符合规范的,但是你执行的时候会报错,因为你访问不了这个指针

    cluo@cluo:~/c++$ vi Pointer-3.c
    cluo@cluo:~/c++$ g++ Pointer-3.c
    cluo@cluo:~/c++$ ./a.out Pointer-3.c
    段错误 (核心已转储)
    
    • 1
    • 2
    • 3
    • 4

    野指针是指向一个非法空间的指针。

    #include 
    
    using namespace std;
    
    int main ()
    {
        //野指针,无法访问
        int *p = (int *)0x100;
        cout << *p << endl;
    
       return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    cluo@cluo:~/c++$ vi Pointer-4.c
    cluo@cluo:~/c++$ g++ Pointer-4.c
    cluo@cluo:~/c++$ ./a.out Pointer-4.c
    段错误 (核心已转储)
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这段代码报错的原因是我们没有对 0x100这个地址进行申请,进而直接访问,我们不知道这块地址是否已经被占用,或者没有权限.

    四、const修饰指针

    const有几种用法:

    1. const修饰指针
    2. const修饰常量
    3. const修饰常量和指针

    4.1 const修饰指针

    在这里插入图片描述

    如图 const修饰指针的意思就是:我可以修改指针指向的地址,但是不能修改地址中的值。

    const int * p;
    *p = 20;  //错误
    p = &a;  //正确
    
    • 1
    • 2
    • 3

    4.2 const修饰常量

    在这里插入图片描述
    如图 const修饰常量的意思就是:我能修改地址中的值,但是修改指针指向的地址。

     int const * p;
    *p = 20;  //正确
    p = &a;  //错误
    
    • 1
    • 2
    • 3

    4.3 const修饰常量和指针

    在这里插入图片描述
    如图 const修饰常量的意思就是:我不能修改地址中的值,也不能修改指针指向的地址。

    const int const * p;
    *p = 20;  //错误
    p = &a;  //错误
    
    • 1
    • 2
    • 3

    这个图片有问题 但是我也没有重新去画了。

  • 相关阅读:
    百度百科创建基础概念分享,为什么百度百科那么难做
    CVE-2022-22980 Spring​ Data MongoDB SpEL表达式注入
    [计算机毕业设计]机器学习的数据驱动股票价格预测
    sqllab第二十六关通关笔记
    【Java线程池】 java.util.concurrent.ThreadPoolExecutor 源码分析
    BFC讲解
    iNFTnews|FTX一夜崩塌,但Web3仍前途光明
    【SLAM】3三维刚体运动
    Java优雅解决空指针问题源码级别刨析Optional
    Java Math.floor()方法具有什么功能呢?
  • 原文地址:https://blog.csdn.net/weixin_51178981/article/details/124975971