zoukankan      html  css  js  c++  java
  • C++类库

    include

    using namespace std;

    /*
    指针和引用:
    指针:指向某一块内存的变量。其本身存储的信息就是内存地址的首地址,其类型决定指向内存的大小。
    变量:某一块内存地址数据值的名字。
    引用:已定义变量的别名。
    比喻:
    超市柜子:
    1、第一排右数第三个--------------地址(指针)
    2、柜子号为18--------------------变量名
    3、18难记,谐音记忆为“要发”----引用
    */

    //指针(int、int&、int&、int&、int**)
    //以值交换为例
    //int
    void swap1(int a, int b) { //传进来的是形参
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    }
    void main01()
    {
    int a = 1, b = 2;
    swap1(a, b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl; //交换失败,交换的是形参的值,无法达到交换的目的。
    system("pause");
    }
    //小结:形参无法改变实参的值,指针却可以。
    /

    因为形参是实参传递给子函数的时候定义的一个新的变量,初始时值相等
    用指针的时候,传递的不是值而是实参的地址,改变的就是实参的值。
    */

    //int*
    void swap2(int* a, int *b) { //传递进来的是实参的地址
    int tmp;
    tmp = *a;
    *a = *b;
    *b = tmp;
    }
    void main02()
    {
    int a = 1, b = 2;
    swap2(&a, &b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl; //交换成功
    system("pause");
    }
    //问题1:int a与int a有没有区别? 答:没区别。

    //int&
    void swap3(int& a, int& b) { //引用,传递进来的是实参
    int tmp;
    tmp = a;
    a = b;
    b = tmp;
    }
    void main03() {
    int a = 1;
    int b = 2;
    swap3(a, b);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl; //交换成功,引用即别名
    system("pause");
    }
    //问题1:int &a与int& a有没有区别? 答:没区别。

    //int*&
    void swap4(int &a, int&b) { //传入的是a的地址,这里&a表示a的别名,其实还是一个东西。想想18和“要发”的关系
    int tmp = a; //里面操作和a一样,整体可以理解为超市的柜子号码18和“要发”的关系。
    *a = *b; //传入的是别名的地址?
    *b = tmp;
    }
    void main() {
    int a = 1;
    int b = 2;

    int *aPtr = &a;    //用aPtr存放a地址
    int *bPtr = &b;    
    swap4(aPtr, bPtr);
    
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;   //交换成功
    system("pause");
    

    }

    //int&*
    //void swap5(int &a, int &b) {} //c++定义失败
    //小结:没有&*a的形式

    //int**
    void swap6(int **a, int **b) { //目的都是要对实参进行操作,这里传入的是地址的地址
    int tmp;
    tmp = **a;
    **a = **b;
    **b = tmp;
    }
    void main06() {
    int a = 1, b = 2;

    int *aPtr = &a;  //存放变量a的地址  
    int *bPtr = &b;  
    
    int **aPtr2 = &aPtr;  //存放变量a的地址的地址
    int **bPtr2 = &bPtr;
    swap6(aPtr2, bPtr2);
    cout << "a=" << a << endl;
    cout << "b=" << b << endl;
    system("pause");
    

    }
    /*
    问题1:地址不能直接存放给变量,即int b=&a。为什么?
    答:进行某些操作时,如递增+1 需要的不是+1个,二是加1个整型变量,所以要用地址来进行操作。即*b=&a;。
    小结:变量地址不能直接存放,需要通过指针来间接存放。 存放变量地址的格式: int *a=&b;
    */

    /*
    总结:
    1、void swap1(int a, int b)----------传入的是形参,无法对实参进行内存实际操作。
    2、void swap2(int* a, int b)--------传入的是实参地址,可以对实参进行内存实际操作。
    3、void swap3(int& a, int& b)--------引用的格式,传入的是实参的地址,可以对实参进行内存实际操作。相当于已经确定了实参,内部函数可以直接对实参进行操作,非特殊情况不需要加
    或&。
    4、void swap4(int &a, int&b)-------传入的是实参地址的指针,格式化操作:外部:存放地址:b=&a;内部:a
    5、void swap5(int &a, int &b)------格式错误
    6、void swap6(int a, int b)------传入的是地址的地址,格式化操作:外部:存放一地址:*b=&a; 存放二地址:c=&b;内部:a;
    要想对实参的内存进行操作,就要先锁定实参。然后根据格式改操作。
    */

    Copyright @WinkJie
  • 相关阅读:
    SpringBoot与quartz集成
    SpringBoot 中使用 @Valid 注解 + Exception 全局处理器优雅处理参数验证
    搭建Redis集群和MySQL主从同步
    scanf_s读取键盘输入字符串失败
    含有通配符*的字符匹配(C语言)
    人之患
    TCP socket编程记录(C语言)
    程序变量命名规范(个人)
    h lib dll文件相关部分
    关于inet_ntop、inet_pton中的n和p分别代表的意义
  • 原文地址:https://www.cnblogs.com/WinkJie/p/11286341.html
Copyright © 2011-2022 走看看