前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++ 指针、引用的梳理

C++ 指针、引用的梳理

作者头像
雪碧君
发布于 2023-02-15 07:12:25
发布于 2023-02-15 07:12:25
49500
代码可运行
举报
运行总次数:0
代码可运行

* 指针运算符 可作为左值。表示查询到指针所对应的内存空间这样的操作。

& 地址运算符,可以概括为 取址运算符,从变量或对象等获取到该元素所在的内存空间中对应的地址。

指针定义

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int i = 0;
int * pt = &i;

/* 
 未定义类型指针
 void类型指针可以存入任何类型的变量地址,但是不能直接被使用。使用的时候需要强制转换类型。
*/
int  i = 10;
bool b = false;
void * tentativePointer;
tentativePointer = & i;
i += static_cast<int *>(tentativePointer);
tentativePointer = & b;
b = !static_cast<bool *>(tentativePointer);

// 常量指针  指针所对应的地址的值被保护
int a;
a = 10; // √ a是变量 可以修改
const int *p1 = &a; // 指针
*p1 = 5; // × 不能通过p1 给a赋值

int b = 5;
p1 = &b; // √ 可以将p1转向其他变量

// 常指针  指针的地址被保护,即确定地址之后 不能修改,但对应的值可以修改。
int a;
a = 10;
int * const p2 = &a;
*p2 = 5; // √

int b = 5;
p2 = &b; // ×
指向对象的指针

指向对象的指针和其他类型的区别在于,访问对象的属性或方法不能通过.操作符。需要使用->

实际上这里的object->method()等价于 (* object).method(),这是c++提供的一种语法糖。

另外,每个对象的方法内,默认隐含了一个this属性,实际上是指向该对象本身的。

指针的运算

算数运算

对指针的运算并非对地址进行修改,而是对于指针所指向的内存空间进行偏移定位。 而每一次移动的单位,取决于指针所表示的类型,例如 char 占用一个字节,那么 p++则会从010A0000前往010A0001,而如果是 int 类型,那么每次会移动4个字节,如从010A00B0前往010A00B4。 由于数组在内存中是紧密相连排列的,所以我们也就可以通过第一个元素的地址和[n]下标来查询对应的元素。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
int a[] = {1,2,3,4,5};
cout << *(a+3) << endl;
// 会输出4 
// *(a+3) 等价于 a[ 0 + 3 ]
关系运算

一般来说同类型的指针可以进行比较操作。 另外可以将指针与0做比较,判断指针是否为空。(如果是新标准 可能不行)

指针传参

指针传参是十分重要的一个特性了,失去了指针,C++也就失去了他最大的性能优势。 传递指针本身是很容易的,即使用 * type param_name这样的形式定义参数即可。外部调用时,将对应的实参地址进行填入即可。

这时,如果为了保护数据的可靠性,可以用const修饰参数类型。

普通参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 批量打印
void printArray( const int * arr, int len ){
    for( int i=0; i<len; i++ ){
        cout << arr[i] << endl;
    }
}
int a[] = {1,2,3,4,5};
printArray( a,5 );

// 批量修改
void batchIncrease( int * arr, int len, int n ){
    for( int i=0; i<len; i++ ){
        arr[i] += n;
    }
}
int b[] = {1,2,3,4,5};
batchIncrease( b, 5, 2 );
printArray( b );

// 输出 3,4,5,6,7

当实参不是数组类型的时候,我们无法通过[]操作符进行寻秩操作,这个时候需要使用 * 运算符来获取地址对应的值。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void splitFloat(float x, int *intPart, float *fracPart) {
   *intPart = static_cast<int>(x); //取x的整数部分
   *fracPart = x - *intPart; //取x的小数部分
}
函数参数

需要实现传递函数作为回调函数的时候,我们可以将函数名作为 函数指针参数传递进去。比较典型的用法是,遍历回调。 例如我们对一系列的对象进行遍历的时候,我们设计的遍历函数是一个通用 或者说一个接口,它能够支持调用者用各式各样的方式来处理遍历时的元素,那么这个时候函数指针是非常有用的。

函数指针参数的格式为:return_type( * function_name )( function_params )

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T>
void forEach( T * elements, int len , void(* callback)( const T el ) ){

    for( int i=0; i<len; i++ ){
        callback( T )
    }
}

// 可以再考虑一下传递的T 采用引用的类型如何编写

除此之外,函数指针不仅限于传参,和普通类型一样,函数指针一样可以先定义,后赋值为各个具体的函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void (*pf)(int,char*);
void fun(int n,char *s) {......}
pf=fun;

指针类型函数

指针类型函数就是返回一个指针(内存地址)的函数。定义十分简单,在返回类型后增加 * 标识符即可。 但是需要注意,返回的指针应当是一个返回后依然有效的指针,否则会产生越界,野指针或是更多错误。

这个问题很好理解,如果你在网上购物,给了一个地址,千万不要给酒店门牌号,因为快递送过来的时候,你已经不在酒店了。无论是租房还是买房,只要你收货的时候,你这个地址还是有效的,那就可以~

所以无论是返回外部变量中的有效地址,还是通过new 进行动态分配的空间地址,都是可以顺利返回给调用者。 而动态分配的地址,永恒的点就是不要忘了delete。

其他补充

基于范围循环

for( type & e : array ){} 基于范围循环是类似于很多其他语言中提供的in循环,比如Javascript中的for( var k in arr ){}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C++基础入门丨7. 指针——一文搞懂指针
我们知道每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。
AXYZdong
2023/03/07
4720
C++基础入门丨7. 指针——一文搞懂指针
C++基础知识
static 定义的静态局部变量分配在数据段上,普通的局部变量分配在栈上,会因为函数栈帧的释放而被释放掉。
代码的路
2022/08/23
1.4K0
C++基础知识
手把手教你深入理解c/c++中的指针
指针是c语言为什么如此流行的一个重要原因,正是有了指针的存在,才使得c/c++能够可以比使用其他语言编写出更为紧凑和有效的程序,可以说,没有掌握指针,就没有权利说自己会用c/c++.然而。然而对于大多数初学者,面对指针这个概念简直是望而生畏,如果前期指针运用的不熟练,后期编写的程序随时都有可能成为一颗定时炸弹,因此今天我就花点时间给大家解释一下我自己对c/c++中指针的理解。
AI算法与图像处理
2021/01/20
5230
手把手教你深入理解c/c++中的指针
C语言进阶-高阶指针
目录 前言 字符指针 指针数组 数组指针 &数组名VS数组名 数组指针的使用 数组参数、指针参数 一维数组传参 二维数组传参 一级指针传参 二级指针传参 函数指针 函数指针数组 指向函数指针数组的指针 ---- 前言 对于初阶指针内容在我的另一篇文章中已经写到(有想法的可以去看看) 附上链接:C语言初阶指针 回顾: 1. 指针是地址,指针变量是用来存放地址的变量(唯一标识一块内存空间)  2. 指针的大小是固定的4/8个字节(32位平台/64位平台)  3. 指针的类型决定了指针的+-整数的步长,指
用户9645905
2022/11/30
3990
C语言进阶-高阶指针
C++快速扫盲(基础篇)
**注意:**与while的区别在于do…while会先执行一次循环语句,再判断循环条件
zstar
2022/06/14
7680
C++基础语法
包含了一个iostream的文件头。头文件作为一种包含功能函数、数据接口声明的载体文件,通常编译器通过头文件找到对应的函数库,把引用的函数实际内容导出来。
全栈程序员站长
2022/07/13
9420
指针
#define _CRT_SECURE_NO_WARNINGS 1 #include "test.h" int main() { //1、定义指针 int a = 10; //指针定义的语法 : 数据类型 * 指针变量名; int * p; //让指针记录变量a的地址 p = &a; cout << "a的地址为: " << &a << endl; // 000000A73899F734 cout << "指针p为: " << p << endl; // 000000A73899F734 //2、使用指针 //可以通过 解引用 的方式来找到 指针 指向的内存 // 指针前加 * 代表解引用,找到指针指向的内存中的数据 cout << "a = " << *p << endl; //a=10 //对指针 指向的内存 重新赋值 *p = 1000; cout << "a = " << a << endl; //1000 cout << "*p = " << *p << endl; //1000 }
用户10731060
2023/08/30
1830
C++基础入门_C语言入门基础
​ Visual Studio是我们用来编写C++程序的主要工具,我们先将它打开
全栈程序员站长
2022/09/30
5.7K0
C++基础入门_C语言入门基础
C++(STL):05---智能指针之unique_ptr
一、unique_ptr类 头文件:#include<memory> 智能指针,是一个模板。创建智能指针时,必须提供指针所指的类型 与shared_ptr的不同之处: shared_ptr所指向的对象可以有多个其他shared_ptr智能指针 而unique_ptr所指向的对象只能有一个unique_ptr指针,也就是自己。当unique_ptr被销毁时,它所指向的对象也被销毁 二、unique_ptr类的初始化 unique_ptr指针需要绑定到一个new返回的指针上,并且不能直接将new的结果用赋值运算
用户3479834
2021/02/03
1K0
指针
对于上面的代码 这里的p是指针变量——是用来存放地址的变量; 可以这样理解**从_可以看出p是个指针变量,p指向的内容是int类型的。_ *p = 20,此处的 * 是解引用操作符。 &为取地址操作符 指针的类型是根据原来值的类型来确定用什么类型的指针。如:char类型,那就用char* 。 去掉指针变量名剩下的就是指针的类型
code-child
2023/05/30
3030
指针
【C语言】指针进阶:字符指针&&数组指针&&函数指针
✨作者:@平凡的人1 ✨专栏:《C语言从0到1》 ✨一句话:凡是过往,皆为序章 ✨说明: 过去无可挽回, 未来可以改变 ---- 🌹感谢您的点赞与关注,同时欢迎各位有空来访我的🍁平凡舍 ---- 文章目录 @[toc] 🚀前言 🚀字符指针 🚀指针数组 🚀数组指针 🍁&数组名 与 数组名 🍁数组指针的使用 🚀数组传参、指针参数 🍁一维数组传参 🍁二维数组传参 🍁一级指针传参 🍁二级指针传参 🚀函数指针 🚀结语 🚀前言 回想之前,我们学了指针的一些基础👉 指针与结构体 我们知道了指针的概念
平凡的人1
2022/11/15
3K0
【C语言】指针进阶:字符指针&&数组指针&&函数指针
C/C++ 操作数组与指针笔记
const 使用场景 高效传递,一般为了高效,我们使用地址传递,这样就无须重复拷贝了。
微软技术分享
2022/12/28
7370
C语言指针深度解剖
指针是C语言的灵魂,深入理解指针,是学好学会C语言的重要前提。因此,本文将重点讲解C语言指针的深度内容。
二肥是只大懒蓝猫
2023/03/30
4800
C语言指针深度解剖
什么?C/C++面试过不了?因为你还没看过这个!
(为了方便记忆可以想成)被 const 修饰(在 const 后面)的值不可改变,如下文使用例子中的 p2、p3。
杨源鑫
2020/06/04
3.7K0
指针的梳理
在探讨指针之前,我们首先明确它的定义:指针是一种特殊的变量,它存储了另一个变量的内存地址。指针在编程过程中有着不可或缺的作用,不仅能提高编程的速率,指针的使用也能增加代码的灵活性,能够深入程序员对代码的理解。
用户11029103
2024/03/19
900
指针的梳理
C++复习篇
2.指针const 1) 底层const(位于*左侧) const int *p : const修饰*p为常量,也就是说该指针指向的对象内容是个常量,只能改变指向的地址.但是可以通过其他方式修改对象内容 例如:
诺谦
2019/05/24
1.3K0
指针用法及分类
在这个例子中,createArray 函数将返回一个指向动态分配的数组的指针。在 main 函数中调用 createArray 函数,并打印出返回的数组的元素。最后需要记得使用 free 函数释放分配的内存空间。
小李很执着
2024/06/15
640
C++ 类成员指针
成员指针是 C++ 引入的一种新机制,它的申明方式和使用方式都与一般的指针有所不同。成员指针分为成员函数指针和数据成员指针。
恋喵大鲤鱼
2022/11/29
8020
【c++】智能指针详解&&c++特殊类设计&&c++的类型转换
下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题
用户10925563
2024/08/06
1960
【c++】智能指针详解&&c++特殊类设计&&c++的类型转换
C/C++函数指针与指针函数
上面一个 4GB 的内存可以存放 2^32 字节的数据。左侧连续的十六进制编号就是内存地址,每个内存地址对应一个字节的内存空间。而指针变量保存的就是这个编号,也即内存地址。
C语言与CPP编程
2020/10/20
2.6K0
相关推荐
C++基础入门丨7. 指针——一文搞懂指针
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文