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

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C++

  • 1、堆和栈
  • 2、指针
    • 2.1、指针的本质
    • 2.2、指针的意义
    • 2.3、清空指针
    • 2.4、C++类中的this
  • 3、malloc and new
  • 4、命名空间
    • 4.1、创建命名空间
    • 4.2、使用命名空间
  • 5、编译程序的四个步骤
    • 5.1、预处理
    • 5.2、编译
    • 5.3、汇编
    • 5.4、链接

1、堆和栈

堆(heap)和栈(stack)都是一种内存空间。
空间的分配是由系统自动完成的,用来存放各种变量和寄存器,无论是全局变量还是局部变量,都存储在其中。同时每个程序线程都有属于自己的栈空间,用以保证之间互不干扰。
而在一个线程当中的每一个函数在被调用的时候,也会被分配一些属于自己的栈空间,用以存放该函数所用到的局部变量和一些必要的寄存器信息。当函数被调用结束,其对应的栈的空间也会被释放。因此,局部变量的生存周期终止于栈空间被释放。
空间的分配则需要人为干涉了,它可以用来存放一些临时变量,其空间相来说也大一些。更加不同于栈的一点是,堆是任何函数都可以访问的,不存在局限性。
在这里插入图片描述

2、指针

指针是C语言学习的时候用到,但这里再次记录一下,以便理解后面的内容。

2.1、指针的本质

指针是一种存放地址的特殊变量,它也有属于自己的地址。因此,指针并不等于地址!!!
我们可以通过以下代码查看指针存放的地址,以及指针本身的地址。

void main()
{int *point;printf("point's value is %p\n",point);printf("point's address is %p\n",&point);
}

再通过以下几个例子可以进一步了解指针本质。

错误示例:int *p;  *p = 9;

错误原因:这里p指针存放的是NULL的地址,所以这句代码相当于让NULL地址对应的变量(NULL)去存放9这个数。而NULL即是空,让空去存放东西,显然是错误的。

正确示例1:int *p;int a;p = &a;a = 9;
正确示例2:int *p;int a;p = &a;*p = 9;

正确原因:通过p=&a;这句代码让p指针存放a变量的地址,那么无论是直接修改a,还是通过地址索引a再修改之,结果都是一样的。
此外,由于在32为计算机,地址则占4个字节,在64位计算机中,地址占6个字节或8个字节的缘故,指针的大小也是其对应地址所占的空间。

2.2、指针的意义

指针可以说是C语言的灵魂,即便在C++当中也发挥着巨大的作用。以下对于指针的意义仅是我个人学习过程中的所感所获。
意义一:在大部分程序语言中,函数的返回值一般分为两种情况,一种是返回一个值,另一种则是返回一个地址。我们称之为传值传址。而传址的目的,还是为了获得目标值,所以此时用到的就是指针的解引用功能。
当然,一般不再用return,也是在函数内直接调用另外一个目标函数,然后把地址作为参数传进去。如下例子。这样做的原因是为了避免在return之后,局部变量的生命中止,原地址被释放。
意义二:指针的存在,相当于提供了一个访问变量的新通道,通过指针,我们可以跨栈区去范围变量,当然也可以访问堆。下面讲malloc和new的时候会用到。

#include<stdio.h>void function_1(void);
void function_2(int *);void function_1()
{int i,temp[10];for(i=0;i<10;i++){temp[i] = i;}function_2(temp);}void function_2(int *temp)
{printf("the value is %d \n",temp[5]);
}int main()
{function_1();return 0;
}

2.3、清空指针

再次强调,指针其实一种存放地址的特殊变量,所以清空指针,是让地址不指向任何值的意思。那么让其指向NULL即可。

*point = NULL;

2.4、C++类中的this

this是每一个对象(类的实例化)都有的一个隐含参数,它是对象本身的地址,作用域也在仅限于对象自身。
注:声明一个东西,无论是类还是其他变量,它本身的变量不占空间的,只有实例化之后才开始占据内存,才有所谓的地址。
举个例子:

class Car
{
public:int temp1;Car(int num){cout<<"the license plate of this car is:"<<num<<endl; } void run(){int num = this->temp1;    //访问对象的temp1属性,当然在这里不加这个this也是可以的。用->是因为this是指针。}
private:int temp2;
};

3、malloc and new

malloc和new都是用来分配堆空间的函数指令,其返回值都是一个地址。
其中malloc的函数定义是:void * malloc(unsigned int size); 可以看出,malloc为程序申请了一个size字节大小的控制,并返回一个这个空间的首地址。

使用方法:
int *p = malloc(4);
float *p = malloc(4);
...
free(p); //malloc和free是成对出现的,使用完内存,要用free把内存还回去。

new则常用于C++为类分配内存空间,可以理解为malloc的进化版。new的实现过程可以分为两步,第一步和malloc一样,向堆申请空间。第二步则是执行构造器,对类进行初始化。

#include <iostream>using namespace std;class Car
{
public:Car(int num){cout<<"the license plate of this car is:"<<num<<endl; } int temp1;
private:int temp2;         
};int main()
{Car *mycar = new Car(888);mycar->temp1 = 5;	//mycar->temp2 = 5;  ×,即便指针,也不能访问私有变量  delete(mycar);     //delate和new成对出现,也是为了释放已经使用完毕的堆空间,反正内存泄漏。mycar = NULL; //最好还是清空一下指针return 0;
}

其中,Car *mycar = new Car(888)意思是向堆申请一块可以存放这个类所有成员函数和变量的空间,返回这个空间的首地址。那么当然得用指向这个类的指针去接收这个地址了。而由于mycar此时已经是一个指针,那么要去访问类里面的成员变量就要用到’->‘而不是’.'了。

mycar->temp1 等于 (*mycar).temp1

4、命名空间

4.1、创建命名空间

一般把命名空间放在头文件里,不同的命名空间也是使用不同的栈区,这使得它们即使有相同名字的变量也毫不冲突。
在以下的这个例子里,假设我们创建了一个myspace.h文件,然把命名空间到定义放在.h文件中。

#ifndef MY_SPACE     // ifndef == if no define。防止多次引用头文件的时候,重复执行以下代码
#define MY_SPACE   namespace  myspace
{....
}#endif

4.2、使用命名空间

#include "myspace.h"  //引用自己创建的头文件用“”号,引用系统的文件的时候用<>号。
using namespace myspace;

用了以上这句代码,就可以在该源文件中使用myspace里的所有函数和类。这其实和之前用到的using namespace std是一样的原理。但如果怕不同命名空间在这个文件中出现同名函数或同名变量冲突,可以不使用using namespace …,在需要用到该空间函数或变量的时候再使用以下语句。

myspace::函数or变量

5、编译程序的四个步骤

5.1、预处理

将所有头文件拉取进来,并读取程序所有宏定义,将#if、#ifndef等指令执行完,留下需要用到的代码块。

5.2、编译

检查程序是否有错误。

5.3、汇编

将程序转化为机器能读懂的汇编指令。

5.4、链接

将多个源文件链接起来。

相关文章:

C++学习笔记(堆栈、指针、命名空间、编译步骤)

C 1、堆和栈2、指针2.1、指针的本质2.2、指针的意义2.3、清空指针2.4、C类中的this 3、malloc and new4、命名空间4.1、创建命名空间4.2、使用命名空间 5、编译程序的四个步骤5.1、预处理5.2、编译5.3、汇编5.4、链接 1、堆和栈 堆&#xff08;heap&#xff09;和栈&#xff0…...

Rust Yew应用开发的事件初探

在Rust的世界中有一个叫Yew的框架&#xff0c;它借鉴了React的思想。我的React代码也写了不少&#xff0c;今天就聊一下我个人对Yew应用开发中事件相关部分的体验。 我的也是才开始学习Rust和Yew&#xff0c;说得不对的地方还请大家多多指教。 下面的例子涉及到3个组件 Paren…...

高并发下单例线程安全

1.使用静态内置类实现单例模式 自定义线程池 2.使用static代码块实现单例 3.使用静态内置类实现单例模式 4.使用static代码块实现单例 public class MySingleton {//使用volatile关键字保其可见性volatile private static MySingleton instance null;private MySingleton…...

【EKF】EKF原理

原理简述 卡尔曼滤波可以在线性模型&#xff0c;误差为高斯模型的情况下&#xff0c;对目标状态得出很好的估计效果&#xff0c;但如果系统存在非线性的因素&#xff0c;其效果就没有那么好了。比较典型的非线性函数关系包括平方关系&#xff0c;对数关系&#xff0c;指数关系…...

蓝桥杯官网填空题(古堡算式)

题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 福尔摩斯到某古堡探险&#xff0c;看到门上写着一个奇怪的算式&#xff1a;ABCDE ∗ ?EDCBA 他对华生说&#xff1a;“ABCDE 应该代表不同的数字&#xff0c;问号…...

Python---集合set

集合特点 1. 可以容纳多个数据 2. 可以容纳不同类型的数据 3.数据是无序存储的&#xff08;不支持下标索引&#xff09; 4. 不允许重复数据存在 5. 可以修改 6. 支持for循环&#xff0c;不支持while循环 集合定义 # 定义集合 变量 {元素1, 元素2, 元素3, 元素4...}# 定…...

LORA项目源码解读

大模型fineturn技术中类似于核武器的LORA&#xff0c;简单而又高效。其理论基础为&#xff1a;在将通用大模型迁移到具体专业领域时&#xff0c;仅需要对其高维参数的低秩子空间进行更新。基于该朴素的逻辑&#xff0c;LORA降低大模型的fineturn门槛&#xff0c;模型训练时不需…...

Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(一)

不重要的目录标题 前提条件第一步&#xff1a;新建文件夹第二步&#xff1a;使用VS/ VS code/cmd 打开该文件夹第三步&#xff1a;安装依赖第四步&#xff1a;试运行react第五步&#xff1a;整理项目结构 前提条件 安装dotnet core sdk 安装Node.js npm 第一步&#xff1a;新…...

html 学习 之 文本标签

下面是一些常见的HTML文本标签&#xff08;&#xff0c;&#xff0c;&#xff0c;&#xff0c;和&#xff09;以及它们的作用&#xff1a; 标签 (Emphasis - 强调): 作用&#xff1a;用于在文本中表示强调或重要性。 示例&#xff1a; <p>这是一段文本&#xff0c;&l…...

联发科3纳米芯片预计2024年量产,此前称仍未获批给华为供货

9月7日&#xff0c;联发科与台积电共同宣布&#xff0c;联发科首款采用台积电3纳米制程生产的天玑旗舰芯片开发进度顺利&#xff0c;已成功流片&#xff0c;预计将在2024年量产&#xff0c;并将于下半年正式上市。这款旗舰芯片并非今年上市的天玑9300。 据联发科总经理陈冠州介…...

搭建vue3项目并git管理

搭建vue3项目 采用vue3的create-vue脚手架搭建项目&#xff0c;底层是vite&#xff0c;要求环境 node 16.0及以上&#xff08;node -v检查node版本&#xff09; 在文件夹右键->终端-> npm init vuelatest&#xff0c;输入项目名称&#xff0c;根据需要选择是否装包 src…...

【Azure OpenAI】OpenAI Function Calling 101

概述 本文是结合 github&#xff1a;OpenAI Function Calling 101在 Azure OpenAI 上的实现&#xff1a; Github Function Calling 101 如何将函数调用与 Azure OpenAI 服务配合使用 - Azure OpenAI Service 使用像ChatGPT这样的llm的困难之一是它们不产生结构化的数据输出…...

立晶半导体Cubic Lattice Inc 专攻音频ADC,音频DAC,音频CODEC,音频CLASS D等CL7016

概述&#xff1a; CL7016是一款高保真USB Type-C兼容音频编解码芯片。可以录制和回放有24比特音乐和声音。内置回放通路信号动态压缩&#xff0c; 最大42db录音通路增益&#xff0c;PDM数字麦克风&#xff0c;和立体声无需电容耳机驱动放大器。 5V单电源供电。兼容USB 2.0全速工…...

【Flutter】支持多平台 多端保存图片到本地相册 (兼容 Web端 移动端 android 保存到本地)

免责声明: 我只测试了Web端 和 Android端 可行哈 import dart:io; import package:flutter/services.dart; import package:http/http.dart as http; import package:universal_html/html.dart as html; import package:oktoast/oktoast.dart; import package:image_gallery_sa…...

postgresql 安装教程

postgresql 安装教程 本文以window 15版本为教程 文章目录 postgresql 安装教程1.下载地址2.以管理员身份运行3.选择安装路径&#xff0c;点击Next4.选择组件&#xff08;默认都勾选&#xff09;&#xff0c;点击Next5.选择数据存储路径&#xff0c;点击Next6.设置超级用户的…...

手写数据库连接池

数据库连接是个耗时操作.对数据库连接的高效管理影响应用程序的性能指标. 数据库连接池正是针对这个问题提出来的. 数据库连接池负责分配,管理和释放数据库连接.它允许应用程序重复使用一个现有的数据路连接,而不需要每次重新建立一个新的连接,利用数据库连接池将明显提升对数…...

在CentOS7上增加swap空间

在CentOS7上增加swap空间 在CentOS7上增加swap空间&#xff0c;可以按照以下步骤进行操作&#xff1a; 使用以下命令检查当前swap使用情况&#xff1a; swapon --show创建一个新的swap文件。你可以根据需要指定大小。例如&#xff0c;要创建一个2GB的swap文件&#xff0c;使用…...

@Autowired和@Resource

文章目录 简介Autowired注解什么是Autowired注解Autowired注解的使用方式Autowired注解的优势和不足 Qualifier总结&#xff1a; Resource注解什么是Resource注解Resource注解的使用方式Resource注解的优势和不足 Autowired vs ResourceAutowired和Resource的区别为什么推荐使用…...

QTableView通过setColumnWidth设置了列宽无效的问题

在用到QT的QTableView时&#xff0c;为了显示效果&#xff0c;向手动的设置每一列的宽度&#xff0c;但是如下的代码是无效的。 ui->tableView->setColumnWidth(0,150);ui->tableView->setColumnWidth(1,150);ui->tableView->setColumnWidth(2,150);ui->t…...

【用unity实现100个游戏之10】复刻经典俄罗斯方块游戏

文章目录 前言开始项目网格生成Block方块脚本俄罗斯方块基类&#xff0c;绘制方块形状移动逻辑限制移动自由下落下落后设置对应风格为不可移动类型检查当前方块是否可以向指定方向移动旋转逻辑消除逻辑游戏结束逻辑怪物生成源码参考完结 前言 当今游戏产业中&#xff0c;经典游…...

设计模式和设计原则回顾

设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

动态 Web 开发技术入门篇

一、HTTP 协议核心 1.1 HTTP 基础 协议全称 &#xff1a;HyperText Transfer Protocol&#xff08;超文本传输协议&#xff09; 默认端口 &#xff1a;HTTP 使用 80 端口&#xff0c;HTTPS 使用 443 端口。 请求方法 &#xff1a; GET &#xff1a;用于获取资源&#xff0c;…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

打手机检测算法AI智能分析网关V4守护公共/工业/医疗等多场景安全应用

一、方案背景​ 在现代生产与生活场景中&#xff0c;如工厂高危作业区、医院手术室、公共场景等&#xff0c;人员违规打手机的行为潜藏着巨大风险。传统依靠人工巡查的监管方式&#xff0c;存在效率低、覆盖面不足、判断主观性强等问题&#xff0c;难以满足对人员打手机行为精…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...