C++学习(5)(函数 指针 引用)

函数

返回值 基本的区别就是可以返回auto

参数的区别 有 可以有栈区参数 变参数

对于参数还有一个老生长谈的问题 什么是实参什么是形参 我觉得形参就是你自己在写函数参数的时候自己命名的 而实参是你自己传入的,我们也可以把他俩的地址找出来看看他们在哪一个部分的内存

实参会复制给形参而不是地址直接引用

而且函数结束后形参的内存就会被释放掉

但是在这此学习对return 也有了新的理解

可以把他理解位能赋值的break

cpp 复制代码
#include <iostream>

#include <string>

#include <vector>

using namespace std;



//函数的定义

//返回值类型 函数1名(形参类型 变量名)



bool View(int index)

{

    cout << "call view " << index << "" << endl;



    return true;

    //return 可以把他理解位能赋值的break

}

//函数的参数 形参和实参

//参数可以有0个或者多个用,隔开

//参数无void可以省略



void Setsize(int w, int h)

{

    cout << &w << ":" << &h<<endl;

}



//C++11自动推导返回值

auto autofu(int w, int h)

{

    w += h;



    return w;

}



int main()

{

    int w{ 100 };

    int h{ 120 };

    cout << &w << ":" << &h<<endl;

    Setsize(w, h);

    //实参会复制给形参而不是地址直接引用



    if (View(100))

    {

        cout << "ok" << endl;

    }



    cout << autofu(1, 2) << endl;



    std::cout << "Hello World!\n";

}

变量的做用域和函数的关系

全局变量是一个把双刃剑

好处是可以全局访问坏处是它可以全局范围访问

这样他的变化我们不能具体确定他是在哪里变化的

那我们有没有一种变量他又有全局的生命周期但是只能局部访问呢

有的兄弟,有的

和C语言一样C++也有静态变量

静态变量也分全局和局部

静态全局是只有本文件可以访问

静态局部变量只有在这个{}可以访问

起始static就是扩大了生命周期

指针和引用

指针就是内存地址

指针定量是存放指针的变量

引用是C++的新东西

起始引用就是把变量给替换了像是给他起了一个别名

cpp 复制代码
#include <iostream>

using namespace std;



//指针和引用



int main()

{

    //指针

    int x{ 100 };

    cout << "x  " << x << endl;

    cout << "&x  " << &x << endl;

    int* px = &x;

    cout << "*px  " << *px << endl;//*px存着值

    cout << "px  " << px << endl;//px存着x的地址

    cout << "&px  " << &px << endl;//&px是px的地址

    (*px)++;

    cout << "x  " << x << endl;



    //引用 别名

    int& ref{ x };//必须初始化

    cout << "ref  " << ref << endl;

    cout << "&ref  " << &ref << endl;//引用本身不占内存

    std::cout << "Hello World!\n";

}

指针和引用与函数结合

提高效率 修改用户数据(多个返回值) 直接控制内存(嵌入式 快)

在获得多个返回值的这个作用中有一个不成文的规定就是不改变变量的指针要加const

在于函数传递的时候引用的调用方式和普通参数一样

cpp 复制代码
#include <iostream>

using namespace std;

//指针和引用作为参数减少复制

void Test1(const int* x1, const int* y1)//变量不改变要加const

{

    cout << "*x  " << *x1 << "  *y  " << *y1 << endl;

    cout << "x  " << x1 << "y  " << y1 << endl;

}



void Test2(const int& x2, const int& y2)//变量不改变要加const

{

    cout << "x  " << x2 << "  y  " << y2 << endl;

    cout << "&x  " << &x2 << "  &y2  " << &y2 << endl;

}



void Test3( int* x1,  int* y1)//变量不改变要加const

{

    (*x1)++; (*y1)++;

}



void Test4( int& x2,  int& y2)//变量不改变要加const

{

    x2++; y2++;

}



//都可以直接改变值



int main()

{

    int x{ 100 };

    int y{ 100 };

    Test1(&x, &y);

    Test2(x, y);

    Test3(&x, &y);

    cout << "x  " << x << "  y  " << y << endl;

    Test4(x, y);

    cout << "x  " << x << "  y  " << y << endl;



    std::cout << "Hello World!\n";

}

要注意的是指针和引用都不能返回栈区变量

只能返回全局变量,堆区变量,静态变量

Auto变量类型不能直接推导出引用,但是指针可以

cpp 复制代码
#include <iostream>

using namespace std;

//指针和引用作为参数减少复制

void Test1(const int* x1, const int* y1)//变量不改变要加const

{

    cout << "*x  " << *x1 << "  *y  " << *y1 << endl;

    cout << "x  " << x1 << "y  " << y1 << endl;

}



void Test2(const int& x2, const int& y2)//变量不改变要加const

{

    cout << "x  " << x2 << "  y  " << y2 << endl;

    cout << "&x  " << &x2 << "  &y2  " << &y2 << endl;

}



void Test3( int* x1,  int* y1)//变量不改变要加const

{

    (*x1)++; (*y1)++;

}



void Test4( int& x2,  int& y2)//变量不改变要加const

{

    x2++; y2++;

}



int* Test5(void)

{

    int x = 0;

    static int y = 0;

    //return &x;//错误无法传递栈区变量的地址

    return (&y);

}



int& Test6(void)

{

    int x = 0;

    static int y = 0;

    //return &x;//错误无法传递栈区变量的地址

    return y;

}



//都可以直接改变值



int main()

{

    int x{ 100 };

    int y{ 100 };

    Test1(&x, &y);

    Test2(x, y);

    Test3(&x, &y);

    cout << "x  " << x << "  y  " << y << endl;

    Test4(x, y);

    cout << "x  " << x << "  y  " << y << endl;



    std::cout << "Hello World!\n";

}
相关推荐
钱栈up13 分钟前
VSCode 调试多模块 Maven + Spring Boot 后端:从启动失败到一次跑通
java·spring boot·maven
uoKent14 分钟前
c++中new和malloc的区别
java·jvm·c++
十五喵源码网24 分钟前
基于springboot2+vue2的疾病防控综合系统
java·毕业设计·springboot·论文笔记
xiaokcehui30 分钟前
地球物理大地测量学计算系列之十七局部重力场SRBF逼近及其性能指标测评
人工智能·算法·机器学习
砚底藏山河31 分钟前
【量化纯GET实战 #11】移动均线 MA:5 日 20 日 60 日怎么算怎么用
java·python·金融·maven
会周易的程序员32 分钟前
aiDgeController 软PLC虚拟机stvm集成测试报告
c++·物联网·架构·集成测试·st·软plc·iec61131
一只小闪闪42 分钟前
easy-trans java数据通用翻译框架v2.3.0
java·后端·架构
2601_9620558144 分钟前
Spring全部注解
java·后端·spring
chjif1 小时前
一张照片和一段声音如何生成口播视频:MiniMax H3 音画同步实测
java·前端·javascript
布莱克6051 小时前
队列详解:定义、分类、应用场景及与栈的区别(C/C++ 代码讲解)
c语言·开发语言·c++·队列