当前位置: 首页 > news >正文

C语言相关基础内容(part1)(基于:C程序设计语言,KR)

一.变量

1.定义:表示创建变量或分配储存单元。

2.声明:指的是说明变量的性质,但不分配储存单元。

3.局部变量:函数中的变量是函数的私有变量或局部变量,由于它们是在函数中声明的,因此其他函数不能直接访问他们。局部变量之咋爱函数被调用时存在,在函数执行完毕退出时消失。其他语言通常把这类变量称为"自动变量”。

4.外部变量:所有函数中都可以通过变量名访问这种类型的变量。外部变量必须定义在所有函数之外。相比内部变量,外部变量还具有更大的作用域和更长的生存期。外部变量的初始化只能出现在其定义中。

二、作用域

名字的作用域指的是程序中可以使用该名字的部分。对于在函数开头声明的自动变量来说,其作用域是声明改变量名的函数。函数的参数可以将它看作局部变量。

三、内存四区

1、代码区:程序运行期间只读,内容由编译期决定,运行中不可修改。修改逻辑必须重新编译。

2、栈(Stack):存放局部变量、函数参数。由编译器自动分配和释放,随函数调用而生,随函数结束而灭。

3、堆(Heap):通过 malloc/new 手动申请的内存。生命周期不受函数限制,必须手动 free/delete,否则造成内存泄漏。

4.全局区:存放全局变量、static 静态变量和字符串常量,程序启动时分配、结束时由操作系统回收,未显式初始化的变量会被自动置 0,其中字符串常量位于只读段,运行时不可修改。

图:进程内存全景(手绘)

验证代码(来自”黑马程序员“)

//全局区

using namespace std; #include<iostream> //全局变量 int g_a = 10; int g_b = 10; //const修饰的全局变量,全局常量 const int c_g_a = 10; const int c_g_b = 10; int main() { //全局区 //全局变量、静态变量、常量 //创建普通局部变量 int a = 0; int b = 0; cout << "局部变量a的地址为:" << &a << endl; cout << "局部变量b的地址为:" << &b << endl; cout << "全局变量g_a的地址为:" << &g_a << endl; cout << "全局变量g_b的地址为:" << &g_b << endl; //静态变量 static int s_a = 10; static int s_b = 10; cout << "静态变量s_b的地址为:" << &s_a << endl; cout << "静态变量s_b的地址为:" << &s_b << endl; //常量 //字符串常量 cout << "字符串常量的地址为:" << &"Icymemory" << endl; //const 修饰的变量 //const修饰的全局变量,const修饰的局部变量 cout << "全局常量c_g_a的地址为:" << &c_g_a << endl; cout << "全局常量c_g_b的地址为:" << &c_g_b << endl; //const修饰的局部变量 const int c_l_a = 10; //c-const,g-global,l-local const int c_l_b = 10; cout << "局部常量c_l_a的地址为:" << &c_l_a << endl; cout << "局部常量c_l_b的地址为:" << &c_l_b << endl; system("pause"); return 0; }

//栈

#include<iostream> using namespace std; //栈区数据的注意事项----不要返回局部变量地址 //栈区的数据由编译器管理开票 int* func() { int a = 10;//局部变量 存放在栈区,栈区的数据在函数执行完后自动释放 return &a;//返回局部变量的地址 } int main() { //接受func函数返回值 int* p = func(); cout << *p << endl;//第一次可以打印正确的数字是因为编译器做了保留 cout << *p << endl;//第二次不再保留 system("pause"); return 0; }

//堆区 :由程序员来分配释放,若程序员不释放,程序结束由操作系统回收

//用new在堆区开辟内存

#include<iostream> using namespace std; //1、new基本语法 int* func() { //在堆区创建整形数据 //new返回是 该数据类型的指针 int* p = new int(10); return p; } void test01() { int* p = func(); cout << *p << endl; cout << *p << endl; cout << *p << endl; //堆区的数据由程序员开辟,程序员管理释放 //如果想释放堆区数据,delete delete p; //cout << *p << endl; //释放 } //2、堆区利用new开辟数组 void test02() { //创建10个整型数据的数组,在堆区 int *arr = new int[10]; for (int i = 0; i < 10; i++) { arr[i] = i + 100; //给十个元素赋值 } for (int i = 0; i < 10; i++) { cout << arr[i] << endl; } //释放堆区数组(要加"[]") delete[] arr; } int main() { //test01(); test02(); return 0; }

四、命令执行函数/存储管理函数

1.命令执行函数:函数system(char*s)执行包含在字符串s中的命令,然后继续执行当前程序。(例如:system("pause");典型高危函数,不建议使用)

2.存储管理函数:

<1>函数malloc用于动态的分配存储块。

函数声明:

void *malloc(size_t n)

成功:返回一个指针,指向n字节长度的未初始化的存储空间;失败:返回NULL。

<2>函数free(p)释放p指针指向的存储空间,p是此前通过调用malloc函数得到的指针,存储空间的释放顺序没有什么限制,但是,如果释放一个不是通过调用malloc函数得到的指针指向的存储空间,将是一个很严重的错误。

五、野指针("民间说法",未明确定义)

定义:指向未知/无效/已释放内存的指针。

建议使用前判断:

if(p != NULL)

三大成因:

1、未初始化

int* p ;

正确应该

NULL(int* p = NULL;)

2、越界:如:规定的数组长度为10,加了十一个元素。

3、释放了没置空:

free(p);

正确应该

free(p); p = NULL;

对比代码

#include<stdio.h> int main() { int* p;//野指针 printf("未初始化的指针地址:%p\n",(void*)p); int a = 10; p = &a; printf("好指针地址:%p\n", (void*)p); return 0; }

六、vector三指针

1、三指针:_Vector_base

<1>_M_start 容器开始的位置

<2>_M_finish 容器结束的位置

<3>_M_end_of_storage 动态内存最后一个元素的下一个位置

2、位置:指针在栈上,指向的内存在堆。

3、释放空间:

<1>swap函数,传入一个空容器,vector立即释放

<2>shrink_to_fit (C++11):vector容器的成员函数,用于缩减容器的容量以匹配其当前大小,从而释放多余内存

4、总容量Size = [_M_start,_M_finish)

已使用内存Capacity= [_M_start,_M_end_of_storage)

5、扩容机制:<1>寻找一块新内存(几何数增长,如前一个是一,就找一段二的内存)

<2>将[_M_start,_M_finish)复制到新地址

<3>原内存释放

<4>更新三指针到新位置

vector扩容

http://www.jsqmd.com/news/1237729/

相关文章:

  • PLC工程师进阶:突破指令思维掌握工业通信与混合开发
  • 羽毛球智能训练系统:从手工标注到 AI 多模态分析的创业技术复盘
  • 2026年成都办公家具性价比高的推荐指南 - 谁都没有我好看
  • 树结构算法:核心价值与高频解题模板
  • 跨平台文件传输工具LocalSend评测与配置指南
  • Diffusion Transformer (DiT) 架构深度解析:从 U-Net 替换到 AdaLN-Zero 条件调制的下一代扩散模型主干网络演进
  • 存储式测斜仪的设计与应用:从MEMS传感器到工程监测
  • 查重1%查重过了但知网AI率还40%?降AI≠降重,这篇教你彻底解决
  • 2026年成都办公家具性价比高的**单 - 谁都没有我好看
  • 苏州工厂上位机怎么选?2026本地服务商实力拆解与避坑要点 - 米諾
  • 2026年临沂短视频公司哪家好:最新专业测评推荐 - 米諾
  • YOLOv8改进策略【Conv和Transformer】| CVPR2025 CATANet LRSA局部区域自注意力 重叠分块交互 + 共享多头权重,精细复原图像纹理细节
  • ADC药物技术解析与市场趋势
  • SpringBoot协同过滤推荐系统实战:从环境搭建到算法调优
  • 有没有一键转换腾讯元宝到 Word 的工具?试试 AI 导出鸭,一键抓取腾讯元宝对话,自动规整格式导出标准 Word 文件
  • 【EU thetis_MRV网站之额外篇-Ice Class】
  • 行业AIOps能力的差异化设计:金融、电商、游戏与物联网四大行业的运维AI个性化策略
  • Unity游戏实时翻译框架XUnity.AutoTranslator:原理、部署与优化指南
  • 權威核驗!2026年7月浪琴香港官方售後網點地址及客戶服務熱線公示 - 浪琴服务中心
  • 【Bug已解决】GRPOTrainer environment_factory / tools is broken for VLMs whose tools return images 解决方案
  • 企业Agent落地惨败?别怪模型太弱
  • Tableau Desktop Specialist UI解剖指南:从界面像素到考试逻辑
  • 重庆GEO优化公司新**2026丨生成式引擎优化服务商头部**与本地企业选型指南 - 小随科技
  • 吸收电路解析(RCD吸收,RC吸收)
  • 高端名表避坑养护手册,2026 年 7 月百达翡丽**维修服务中心国内**售后地址 热线 - 百达翡丽官方服务中心
  • 社交平台 AI 功能的用户接受度:推荐算法透明性,决定信任成败的关键
  • 2026 年至今,泸定有实力的回收铝线铝电缆实力厂家哪家好,揭秘:废旧电缆的隐藏价值有多高? - 行业甄选官
  • 分布式系统中的配置中心架构:推送、拉取与长轮询的工程选择
  • 哔咔漫画下载器终极指南:三分钟搭建个人漫画图书馆
  • Agent上线前,先做一次dry-run