首页 > 编程语言 >【ChernoC++笔记】指针和引用

【ChernoC++笔记】指针和引用

时间:2023-07-06 14:56:24浏览次数:44  
标签:Cherno int void C++ 引用 ref ptr 指针

指针

【16】C++指针

▶️指针的类型不影响指针的本质:

  • 任何type的指针都是保存着内存地址的整数(integer)。
  • 指针的type只用来使人更好理解。
// 一个最简单的void类型指针,储存内存地址0
void* ptr = 0;
void* ptr = NULL;
void* ptr = nullptr;	// C++11

// 使ptr存储var的内存地址
int var = 8;
void* ptr = &var;
// void*可以换成int*/double*...
int* ptr = &var;
double* ptr = (double*)&var;

// 指针类型: 告诉编译器,存储的地址上的数据是什么类型
int var = 8;
int* ptr = &var;
*ptr = 10; // *: 解引用,访问内存中的数据

❓编译器不知道指针指向的数据究竟有多大,指针不包含数据,只是一个内存地址。

▶️使用关键字new在堆上创建固定大小的变量

// 分配8字节的内存,并返回指向该内存开头的指针
char* buffer = new char[8];
// 将buffer指向的内存地址后的8个字节都设置为0
memset(buffer, 0, 8);
// 堆内存需要手动删除
delete[] buffer;

▶️指针也可以指向另一个指针

// ptr存储buffer的地址
char** ptr = &buffer;

引用

【17】C++引用

▶️引用本身不是新的变量,不占真正的内存空间

可以创建空指针,但只能引用已经存在的现有变量。

int a = 5;
~~int& ref;~~ // 声明一个引用时,必须马上赋值
int& ref = a; // '&'是类型的一部分,不同于指针中取地址的'&'

❓引用的作用—>值传递和引用传递

// 值传递:在Increment函数中创建一个全新的value变量
void Increment(int value) {
	value++; // value = 6
}
int main() {
	int a = 5;
	Increment(a); // a = 5,无法达到增加a的目的
// 解决方法1:使用指针传递a的地址
void Increment(int* value) {
	(*value)++; // *解引用后再++,否则加1的是地址integer
}
int main() {
	int a = 5;
	Increment(&a); // 传入a的地址
// 解决方法2:使用引用传递,实现与指针相同的功能,但更加简洁
void Increment(int& value) {
	value++;
}
int main() {
	int a = 5;
	Increment(a); // a = 6

❓定义了引用之后,能不能改为引用另一个变量?

int a = 5;
int b = 8;
int& ref = a;
ref = b; // a=8, b=8, ref=a=8

ref = b将使a被赋值为b的值,也就是使a=8,而不是将ref改为引用b。

而指针可以指向另一个变量的地址:

int a = 5;
int b = 8;
int* ref = &a;
ref = &b; // a=5, b=8, *ref=b=8

标签:Cherno,int,void,C++,引用,ref,ptr,指针
From: https://www.cnblogs.com/rthete/p/17532125.html

相关文章

  • C++程序课程设计任务书[2023-07-06]
    C++程序课程设计任务书[2023-07-06]C++程序课程设计任务书班级学号姓名一、实践目的该实践在系统学习《C++程序设计基础》课程后进行。通过本实践,培养学生使用C++解决实际问题的能力。二、实践任务与要求(任选一个任务,独立完成)任务一:(一)......
  • C/C++数据结构与算法课程设计[2023-07-03]
    C/C++数据结构与算法课程设计[2023-07-03]数据结构与算法课程设计一、课程设计的目的、要求和任务 本课程设计是为了配合《数据结构与算法》课程的开设,通过设计完整的程序,使学生掌握数据结构的应用、算法的编写等基本方法。1.课程的目的(1)使学生进一步理解和掌握课堂上所学......
  • 结构体,指针函数和数组初始化
    struct_m_malloc_dev{void(*init)(uint8_t);//初始化函数uint8_t(*perused)(uint8_t);//内存使用率uint8_t*membase[SRAMBANK];//内存池管理srambank个区域的内存uint16_t*memmap[SRAMBANK];//内存管理状态表uint8_tmemrdy[SRAMBANK];//内存管理......
  • 一个C++11的线程函数
    一个C++11的线程函数#include<iostream>#include<thread>#include<chrono>voidprintNumbers(){for(inti=1;i<=100;++i){std::cout<<i<<std::endl;std::this_thread::sleep_for(std::chrono::millis......
  • C++ 重载运算符和重载函数
     C++允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不相同。当您调用一个重载函数或重载运算符时,编译器通过把您所使用的参数......
  • c语言结构体指针初始化
    结构体定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构。结构是C编程中另一种用户自定义的可用的数据类型,它允许您存储不同类型的数据项。结构体中的数据成员可以是基本数据类型(如int、float、char等),也可以是其他结构体类型、指针类型等......
  • C/C++ Qt 数据库SqlRelationalTable关联表
    在上一篇博文中详细介绍了SqlTableModle组件是如何使用的,本篇博文将介绍SqlRelationalTable关联表组件,该组件其实是SqlTableModle组件的扩展类,SqlRelationalTable组件可以关联某个主表中的外键,例如将主表中的某个字段与附加表中的特定字段相关联起来,QSqlRelation(关联表名,关联ID,......
  • C/C++ HOOK 全局 API
    全局Hook不一定需要用到Dll,比如全局的鼠标钩子、键盘钩子都是不需要Dll的,但是要钩住API,就需要Dll的协助了,下面直接放上Dll的代码,注意这里使用的是MFCDLL。//Test_Dll(mfc).cpp:定义DLL的初始化例程。//#include"stdafx.h"#include"Test_Dll(mfc).h"#ifde......
  • c++ day1
    跟着数据结构,算法与应用c++语言描述来学习本书第一周计划回顾c++的基础知识本人只是记录自己认为要去记录的一些资料想要系统的学习还是需要去啃书1template<classT>是C++中用于定义模板的语法结构。它表明接下来的代码是一个模板,并且模板参数名为T,它可以是任意合法的C++......
  • 【嵌入式】keil5中使用C,C++混合编译
    5份文件:a.c和a.h和b.cpp和b.h和main.c其中main.c调用b.cpp,b.cpp调用a.c main.c#include"./b.h"intmain(void){ intt=funC(); while(1) { }} b.h#ifndef_B_#define_B_#ifdef__cplusplusextern"C"{#endifintfunC(void);#ifdef__cplusp......