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

C++

  • 1、堆和栈
  • 2、指针
    • 2.1、指针的本质
    • 2.2、指针的意义
    • 2.3、清空指针
    • 2.4、常量指针和指针常量
      • 2.4.1、常量指针(const int *p;)
      • 2.4.2、指针常量(int *const p;)
    • 2.5、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、常量指针和指针常量

2.4.1、常量指针(const int *p;)

指针所指向的地址可以变,指针所指向的值也可以改变。但不过通过解引用指针来改变指针指向的值。

eg_1:(正常使用)
int temp = 9;
const int *p;
p = &temp;
printf("%d",*p);  //输出结果是9eg_2:(改变变量的值,进而改变指针指向的值)
int temp = 9;
const int *p = &temp;
temp = 3;
printf("%d",*p);  //输出结果是3eg_3:(改变指针存放的地址)
int temp1=3,temp2=5;
const int *p = &temp1;
p = &temp2;
printf("%d",*p);  //输出结果是5eg_4:(通过解引用改变指针指向的值❌)
int temp = 9;
const int *p;
p = &temp;
*p = 3;    //不过通过解引用指针来改变指针所指向的值
printf("%d",*p);  //程序报错❌

2.4.2、指针常量(int *const p;)

可以改变指针指向的值,也可以通过解引用指针来改变指针指向的值,但就是不能修改指针存放的地址。

eg_1:(正常使用)
int temp = 9;
const int *p;
p = &temp;
printf("%d",*p);  //输出结果是9eg_2:(通过解引用改变指针指向的值)
int temp = 9;
const int *p;
*p = 7;
printf("%d",*p);  //输出结果是7eg_3:(改变变量的值,进而改变指针指向的值)
int temp = 7;
const int *p = &temp;
temp = 9;
printf("%d",*p);  //输出结果是9eg_4:(改变指针存放的地址❌)
int temp1=3,temp2=5;
const int *p = &temp1;
p = &temp2;             //不能改变指针存放的地址
printf("%d",*p);        //程序报错❌

2.5、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、链接

将多个源文件链接起来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/132293.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用nvm管理node.js

使用nvm管理node.js 一、简介 nvm是一个node的版本管理工具。可以在多种系统上管理Node.js 版本的工具。使用 NVM&#xff0c;可以轻松地切换不同版本的Node.js&#xff0c;并方便地管理不同版本的全局包和本地包。 二、安装与下载 1.删除原有node.js 首先需要卸载已安装的…

[BJDCTF2020]ZJCTF,不过如此 preg_replace /e模式漏洞

目录 preg_replace的/e模式 为什么要变为 {${phpinfo()}} 另一个方法 版本 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)"I have a dream")){echo &qu…

PlantUML——类图(持续更新)

前言 在分析代码流程中&#xff0c;我们常常会使用到各种UML图&#xff0c;例如用例图、时序图和类图等&#xff0c;以往使用ProcessOn或亿图图示等工具&#xff0c;但是这些工具难以规范化&#xff0c;有没有一种用代码来生成图形的工具呢&#xff1f; 刚好在出差的晨会中机缘…

SpringBoot入门

1.SpringBoot简介 1.1SpringBoot是什么&#xff1f; Spring Boot是基于Spring开发的全新框架&#xff0c;相当于对Spring做了又一层封装。 其设计目的是用来简化Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置&#xff0c;从而使开发人员不再需要定义样…

IO多路复用(select模型实现监控两个设备:自定义设备和鼠标设备)

1、驱动程序 #include <linux/init.h> #include <linux/module.h> #include <linux/cdev.h> #include <linux/fs.h> #include <linux/io.h> #include <linux/slab.h> #include <linux/wait.h> #include <linux/uaccess.h> #i…

4核8G服务器腾讯云CVM S5性能如何?CPU型号及租用价格

腾讯云4核8G服务器CVM标准型S5实例性能测评&#xff0c;包括CPU型号、内存、系统盘、CVM实例规格性能测评&#xff0c;腾讯云4核8G租用优惠价格表&#xff0c;腾讯云服务器网分享腾讯云4核8G服务器CVM S5性能测评和租用费用&#xff1a; 目录 腾讯云4核8G服务器CVM S5性能测评…

Apinto 网关: Go语言实现 HTTP 转 gRPC

gRPC 是由 Google 开发的一个高性能、通用的开源RPC框架&#xff0c;主要面向移动应用开发且基于 HTTP/2 协议标准而设计&#xff0c;同时支持大多数流行的编程语言。 gRPC 基于 HTTP/2 协议传输&#xff0c; HTTP/2 相比 HTTP1.x有以下优势: 采用二进制格式传输协议&#xff…

《C++ Primer》第3章 字符串、向量和数组(三)

参考资料&#xff1a; 《C Primer》第5版《C Primer 习题集》第5版 3.5 数组&#xff08;P101&#xff09; 数组类似于 vector &#xff0c;不同点在于数组的大小固定不变&#xff0c;在某些情况下性能较好&#xff0c;但灵活性较差。 3.5.1 定义和初始化内置数组&#xff…

SpringBoot项目中使用poi-tl打成jar包后常见问题及解决

目录 前言 一、场景描述 1、打成jar包运行后模板找不到 2、文件只能下载一次 二、正确示范 1、Controller下载方法定义 2、文档生成 总结 前言 在前面的博客中&#xff0c;介绍了如何在Java中根据模板动态写入数据到word模板中&#xff0c;原文地址&#xff1a;Java使用…

Pandas数据分析一览-短期内快速学会数据分析指南(文末送书)

前言 三年耕耘大厂数据分析师&#xff0c;有些工具是必须要掌握的&#xff0c;尤其是Python中的数据分析三剑客&#xff1a;Pandas&#xff0c;Numpy和Matplotlib。就以个人经验而已&#xff0c;Pandas是必须要掌握的&#xff0c;它提供了易于使用的数据结构和数据操作工具&am…

第69步 时间序列建模实战:ARIMA建模(R)

基于WIN10的64位系统演示 一、写在前面 这一期&#xff0c;我们使用R进行SARIMA模型的构建。 同样&#xff0c;这里使用这个数据&#xff1a; 《PLoS One》2015年一篇题目为《Comparison of Two Hybrid Models for Forecasting the Incidence of Hemorrhagic Fever with Re…

uniapp小程序 - 隐私协议保护指引接入教程

文章目录 前提&#xff1a;__usePrivacyCheck__: true步骤一、封装弹窗组件步骤二、单个页面引用一、被动监听二、主动查询 前言&#xff1a;官方发布公告&#xff0c;自2023年9月15日起&#xff0c;对于涉及处理用户个人信息的小程序开发者&#xff0c;仅当开发者主动向平台同…

idea VCS配置多个远程仓库

Idea VCS配置多个远程仓库 首先要有两个或多个不同远程仓库地址 idea 添加数据源 查看推送记录 添加数据源 ok之后填写账号密码 推送本地项目 选择不同远程地址 push 查看不同远程地址的 不同分支的 推送记录 不期而遇的温柔&#xff1a; 应用开源架构进行项目开发&#xff0…

【新版】系统架构设计师 - 软件架构设计<新版>

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 软件架构设计&#xff1c;新版&#xff1e;考点摘要概念架构的 4 1 视图架构描述语言ADL基于架构的软件开发方法ABSDABSD的开发模型ABSDMABSD&#xff08;ABSDM模型&#xff09;的开发过程 软件架…

k8s node环境部署(三)

1、添加node1、node2环境 前面配置master环境的截图最后一段 复制下来 分别在node主机执行 kubeadm join 192.168.37.132:6443 --token p5omh3.cqjqt8ymrwkdn2fc \ --discovery-token-ca-cert-hash sha256:608a1cbadd060cfdeac2fae84c19609061b750ab51bf9a19887ff7ea…

C# 辗转相除法求最大公约数

辗转相除法求最大公约数 public static void CalcGCD(int largeNumber, int smallNumber, out int GCD){GCD 1;int remain -1;while (remain ! 0){remain largeNumber % smallNumber;GCD smallNumber;largeNumber smallNumber;smallNumber remain;}}

从零基础到精通Flutter开发:一步步打造跨平台应用

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 导言 Flutter是一种流行…

Java开发之框架(spring、springmvc、springboot、mybatis)【面试篇 完结版】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、框架知识分布二、Spring1. spring-单例bean① 问题引入② 单例bean是线程安全的吗③ 问题总结④ 实战面试 2. spring-AOP① 问题引入② AOP记录操作日志③ …

基于SSM+Vue的中国咖啡文化宣传网站

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用vUE技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

【JAVA-Day09】 Java注释详解:一般注释、文档注释与最佳实践

Java注释详解&#xff1a;一般注释、文档注释与最佳实践 Java注释详解&#xff1a;一般注释、文档注释与最佳实践摘要引言一、一般注释1.1 块注释1.2 单行注释1.3 尾端注释 二、文档注释三、注释的最佳实践四、总结参考资料 博主 默语带您 Go to New World. ✍ 个人主页—— 默…