c++基础补充

c++基础补充

函数补充

函数声明

c 复制代码
#include <iostream>
using namespace std;

int max(int a,int b);

int main() {
    int result = max(1,3);
    cout << result << endl;
    return 0;
}

int max(int a,int b) {
    return a > b ? a : b;
}

函数的分文件编写

作用:让代码更加清晰

  1. 创建后缀名为.h的头文件
  2. 创建后缀名为.cpp的源文件
  3. 在头文件写函数声明
  4. 在源文件写函数定义

指针补充

占用大小

c 复制代码
int main() {
    int a = 4;
    int *ptr = &a;
    // 32 为操作系统 指针占用4个字节
    // 64 为操作系统 指针占用8个字节
    cout << sizeof(ptr) << endl;
    return 0;
}

空指针

值为0的指针
int *p = 0;或者int *p = NULL;

使用

  1. 避免访问非法数据
  2. 指针不在使用时,也可以设置为空指针,也是防御性编程,避免成为野指针
c 复制代码
int *select &xiao_long_lv
select = NULL;
  1. 指针在使用前进行合法性判断
c 复制代码
int *p = NULL;
if(p){ // p 等同于 p!=NULL
// 指针不为空,对指针进行操作
}

坏指针

坏指针,是指没有初始化的指针,或者非法赋值的指针

  1. 情形一
c 复制代码
    int *select;
    cout<<*select<<endl;
  1. 情形二
c 复制代码
 int *select = 100;

野指针

野指针 指向的位置是不可知的(随机的、不正确的、没有明确限制的)

  1. 造成野指针的原因
  • 指针未初始化
  • 指针越界
  • 指针指向的空间被释放
  1. 规避野指针的方法
  • 指针初始化
  • 小心指针越界
  • 指针指向空间释放及时赋值为NULL
  • 避免返回局部变量地址
  • 指针使用之前检查有效性

C++内存分区模型

  • 代码区:存放函数体的二进制代码,有操作系统进行管理
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区: 由编译器自动分配释放,存放函数的参数值、局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区的意义:不同区域存放的数据,赋予不同的生命周期,给我们带来更大的灵活编程

相关推荐
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 14 章 MCP 服务端(上):注解式实现与工具来源
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 15 章 MCP 服务端(下):三种协议形态、Streamable 传输与状态管理
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 16 章 向量存储(上):`VectorStore` 接口体系、`BatchingStrategy`
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 12 章 工具循环的流式形态、Usage 累加与扩展体系
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 23 章 模型供应商实现:从 `OpenAiSetup` 到 Bedrock
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 06 章 内置 Advisor 全景:13 个实现逐个剖到源码级
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 03 章 消息体系与 Prompt:不可变模型、`ChatOptions` 与模板渲染
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 24 章 生产实践与 2.x 迁移:陷阱清单、AOT 与调优
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 10 章 工具调用(中):执行链路、结果转换与工具限制
java·人工智能·开源
鶴哥只手遮天1 小时前
Spring AI 2.0.1 深度解析-第 13 章 MCP 客户端:传输、工具聚合与命名冲突
java·人工智能·开源