C++栈区和引用

栈区

  • 栈的数据由编译器管理开辟和释放;

  • 注意不要返回局部变量的地址

  • 系统会保存一次,但只可以打印一次数据,

堆区

  • 由程序员释放,在程序运行结束后会出现一个堆区。不释放系统自动回收

  • 用new可开辟堆区,指针在栈区可用指针接受堆区的数据。因为指针在栈区指向和堆区一样的地址。可获取堆区的数据

  • int*fun()
    {
    int*p=new int (10);
    return p;
    }
    void text01()
    {
    int*p=fun();
    cout<<*p<<endl;
    delete p;//由程序员释放了.
    }
    int main()
    {
    int*p=fun();
    cout<<*p<<endl;
    }
  • 在堆区开辟数组

  • void text02()
    int *arr=new int [10];//数组有十个元素
    for(int i=0;i<10;i++)
    {
    cout<<arr[i];
    }
    delete [] arr;
    int main()
    {
    text02();
    }

    引用

    • 引用给变量起别名。

    • 语法:数据类型&别名=原名;

    • int &b=a;
      b=20;//修改别名,原名的值也会变
      cout<<a<<endl;//输出的a的值为20
    • 引用必须要初始化

    • int&b;//该操作时错误的

    • 引用一旦初始化后,就不可以更改。也就是只能赋值给b,b不能引用别的数值了。

    • 在main函数中引用本身需要一个合法的内存空间,因此

      int &ret=10;

      const int&ret=10;//加入const后不可以修改变量

    • 引用可以优化指针,不用像指针一样复制一份内存。引用直接给实参起别名。

    • //指针
      void test01(int *a,int *b)
      int main()
      {
      test01(&a,&b);
      };
      //引用
      void test01(int &a,int &b)
      int main()
      {
      test01(&a,&b);
      };
    • //返回局部变量引用
      int &test01()
      {
      int a=10;//局部变量
      return a;
      }
      //返回静态变量引用
      int &test02()
      {
      static int a=20;
      return a;
      }
      int main()
      {
      int &ref1=test01();//不能返回局部变量的引用,第一次还会保存。
      int &ref2=test02();
      test02()=1000;//函数可以作为左值。
      cout<<ref2<<endl;//输出的值为1000;
      }
    • 只有函数静态变量的引用返回值可以作为左值。

       

       

      • 引用的本质就是指针常量,上边的引用可以看成指针常量。系统自动转换int *const ref=&a;指向不可以变,值可以变。

      • 引用在修改方法中的形参时,实参也会改变。故用常量引用const来防止实参被修改

      • void showvalue(const int&a)
      •  

posted @ 2023-04-08 02:44  boyboy!  阅读(66)  评论(0)    收藏  举报