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";

}
相关推荐
罗西的思考30 分钟前
【轻量化复刻大模型】线性注意力交互式演示
人工智能·算法·机器学习
赵小哥要冲啦30 分钟前
社区邻里互助小程序从 0 到 1 复盘:需求拆解与信任机制设计
java·小程序·需求分析
xiaogai_gai34 分钟前
采购业务退款单同步实战:从钉钉审批流到金蝶云星空付款单
java·数据库·钉钉
神也畏惧菠萝41 分钟前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
二哈赛车手1 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript
ZWZhangYu1 小时前
从 Dify 实践理解大模型上下文缓存
java·后端·spring
揽星河..1 小时前
【C语言】分支和循环
c语言·c++·算法
小羊没烦恼!1 小时前
关于分布式锁原理的一些学习与思考-redis分布式锁,zookeeper分布式锁
java·服务器·网络·学习·负载均衡
Fuyo_11193 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法