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

}
相关推荐
吴可可1233 分钟前
SolidWorks草图转三维DWG技巧
算法
凡人叶枫10 分钟前
Effective C++ 条款04:确定对象被使用前已先被初始化
java·linux·开发语言·c++·嵌入式开发
极客先躯16 分钟前
高级java每日一道面试题-2026年02月01日-实战篇[Docker]-Docker Volume 的生命周期管理是怎样的?
java·运维·docker·容器·持久化·架构图·容器卷
不想写代码的星星28 分钟前
std::move 根本不移动,就像老婆饼里没有老婆
c++
NE_STOP32 分钟前
Raft算法处理细节
java
redaijufeng33 分钟前
C++雾中风景7:闭包
c++·算法·风景
努力攻坚操作系统35 分钟前
编程语言编译运行机制对比:C / Java / Python
java·c语言·python
慧一居士37 分钟前
对比两个文件内容是否完全一致,java实现示例
java
再写一行代码就下班1 小时前
Cursor配置Java环境、创建Spring Boot项目的步骤
java·开发语言·spring boot
摇滚侠1 小时前
Java 零基础全套教程,类的加载过程与类加载器的理解,笔记 189
java·后端·intellij-idea