IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> 指针 引用的理解和应用 -> 正文阅读

[C++知识库]指针 引用的理解和应用

1.指针

可以利用指针变量保存地址(通常理解成指针就是一个地址)

当我们阅读一个指针时我们必须得知道2个东西

1)指针类型

从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: 
(1)int*ptr;//指针的类型是int* 
(2)char*ptr;//指针的类型是char* 
(3)int**ptr;//指针的类型是int** 
(4)int(*ptr)[3];//指针的类型是int(*)[3] 
(5)int*(*ptr)[4];//指针的类型是int*(*)[4]

2)指针所指向类型(指针所指向类型代表着指针所存地址内存放的数据的类型)

当你通过指针来访问指针所指向的内存区时,指针所指向的类型决定了编译器将把那片内存区里的内容当做什么来看待。 
从语法上看,你只须把指针声明语句中的指针名字和名字左边的指针声明符*去掉,剩下的就是指针所指向的类型。例如: 
(1)int*ptr; //指针所指向的类型是int 
(2)char*ptr; //指针所指向的的类型是char 
(3)int**ptr; //指针所指向的的类型是int* 
(4)int(*ptr)[3]; //指针所指向的的类型是int()[3] 
(5)int*(*ptr)[4]; //指针所指向的的类型是int*()[4] 
在指针的算术运算中,指针所指向的类型有很大的作用。 
指针的类型(即指针本身的类型)和指针所指向的类型是两个概念。

其它的知识点

1.指针的值或者叫做指针所指向的内存区

指针的值是指针本身存储的数值,这个值将被编译器当作一个地址,而不是一个一般的数值。在32 位程序里,所有类型的指针的值都是一个32 位整数,因为32 位程序里内存地址全都是32 位长。指针所指向的内存区就是从指针的值所代表的那个内存地址开始,长度为si zeof(指针所指向的类型)的一片内存区。以后,我们说一个指针的值是XX,就相当于说该指针指向了以XX 为首地址的一片内存区域;我们说一个指针指向了某块内存区域,就相当于说该指针的值是这块内存区域的首地址。指针所指向的内存区和指针所指向的类型是两个完全不同的概念。在例一中,指针所指向的类型已经有了,但由于指针还未初始化,所以它所指向的内存区是不存在的,或者说是无意义的。?
以后,每遇到一个指针,都应该问问:这个指针的类型是什么?指针指的类型是什么?该指针指向了哪里?(重点注意)?

2.指针本身所占据的内存区

指针本身占了多大的内存?你只要用函数sizeof(指针的类型)测一下就知道了。在32 位平台里,指针本身占据了4 个字节的长度。指针本身占据的内存这个概念在判断一个指针表达式(后面会解释)是否是左值时很有用。

3.特殊的指针

this?指针

this 指针概念
前面我们知道在C++成员变量和成员函数是分开存储的
每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型的对象会共用一块代码
那么问题是:这一块代码是如何区分那个对象调用自己的呢
C++通过提供特殊的对象指针,this指针,解决上述问题,this指针指向被调用的成员函数所属的对象

this指针是隐含每一个非静态成员函数内的一种指针
this指针不需要定义,直接使用即可

this 指针的用途:
1.?? ?当形参和成员变量同名时,可用this指针来区分
2.?? ?在类的非静态成员函数中返回对象本身,课使用return*this

空指针

空指针访问成员函数
C++中空指针也是可以调用成员函数的,但是也要注意有没有用到this指针
如果用到this指针,需要加以判断保证代码的健壮性

*和&的关系

p 代表的是指向的地址
*p代表的是指向地址里的内容
这里&是取地址运算符,*是间接运算符。?
&a 的运算结果是一个指针,指针的类型是a 的类型加个*,指针所指向的类型是a 的类型,指针所指向的地址嘛,那就是a 的地址。?
*p 的运算结果就五花八门了。总之*p 的结果是p 所指向的东西,这个东西有这些特点:它的类型是p 指向的类型,它所占用的地址是p所指向的地址。?
例六:?
int a=12; int b; int *p; int **ptr;
p=&a; //&a 的结果是一个指针,类型是int*,指向的类型是
//int,指向的地址是a 的地址。
*p=24; //*p 的结果,在这里它的类型是int,它所占用的地址是
//p 所指向的地址,显然,*p 就是变量a。
ptr=&p; //&p 的结果是个指针,该指针的类型是p 的类型加个*,
//在这里是int **。该指针所指向的类型是p 的类型,这
//里是int*。该指针所指向的地址就是指针p 自己的地址。
*ptr=&b; //*ptr 是个指针,&b 的结果也是个指针,且这两个指针
//的类型和所指向的类型是一样的,所以用&b 来给*ptr 赋
//值就是毫无问题的了。
**ptr=34; //*ptr 的结果是ptr 所指向的东西,在这里是一个指针,
//对这个指针再做一次*运算,结果是一个int 类型的变量。

总的来说

int *p ;?

1. * 的作用解引用

2. p是一个地址,所以初始化的时候(也就是一般看的?int *p =&a;? =和后面的部分这个过程)

=后面得跟一个地址(补:数组名为数组首元素地址,对于类第一个声明成员的地址就是类的地址,一般的用&取地址用算符可以取到地址)

对括号内知识的补充1. *(arr+n)?等同于arr[n]?

3.int *是指针类型 ---通常*和左边的类型组合起来的就是指针类型

4 int是指针所指向类型---通常*左边的类型就是指针所指向的类型

下面是单个拉出来的指针的理解(基本)

int p; //这是一个普通的整型变量
1.int *p; //首先从P 处开始,先与*结合,所以说明P 是一个指针,然后再与int 结合,说明指针所指向的内容的类型为int 型.所以P是一个返回整型数据的指针
2.int p[3]; //首先从P 处开始,先与[]结合,说明P 是一个数组,然后与int 结合,说明数组里的元素是整型的,所以P 是一个由整型数据组成的数组
3.int *p[3]; //首先从P 处开始,先与[]结合,因为其优先级比*高,所以P 是一个数组,然后再与*结合,说明数组里的元素是指针类型,然后再与int 结合,说明指针所指向的内容的类型是整型的,所以P 是一个由返回整型数据的指针所组成的数组
4.int (*p)[3]; //首先从P 处开始,先与*结合,说明P 是一个指针然后再与[]结合(与"()"这步可以忽略,只是为了改变优先级),说明指针所指向的内容是一个数组,然后再与int 结合,说明数组里的元素是整型的.所以P 是一个指向由整型数据组成的数组的指针
5.int **p; //首先从P 开始,先与*结合,说是P 是一个指针,然后再与*结合,说明指针所指向的元素是指针,然后再与int 结合,说明该指针所指向的元素是整型数据.由于二级指针以及更高级的指针极少用在复杂的类型中,所以后面更复杂的类型我们就不考虑多级指针了,最多只考虑一级指针.
6.int p(int); //从P 处起,先与()结合,说明P 是一个函数,然后进入()里分析,说明该函数有一个整型变量的参数,然后再与外面的int 结合,说明函数的返回值是一个整型数据
7.int (*p)(int); //从P 处开始,先与指针结合,说明P 是一个指针,然后与()结合,说明指针指向的是一个函数,然后再与()里的int 结合,说明函数有一个int 型的参数,再与最外层的int 结合,说明函数的返回类型是整型,所以P 是一个指向有一个整型参数且返回类型为整型的函数的指针
8.int *(*p(int))[3]; //可以先跳过,不看这个类型,过于复杂从P 开始,先与()结合,说明P 是一个函数,然后进入()里面,与int 结合,说明函数有一个整型变量参数,然后再与外面的*结合,说明函数返回的是一个指针,,然后到最外面一层,先与[]结合,说明返回的指针指向的是一个数组,然后再与*结合,说明数组里的元素是指针,然后再与int 结合,说明指针指向的内容是整型数据.所以P 是一个参数为一个整数据且返回一个指向由整型指针变量组成的数组的指针变量的函数.

2.最重要的?上仙符华神州平板,寸劲开颅,天下第一 --一只符华单推人

3.引用

引用可以简单理解为取别名?

int &a=b;

那边b就是a的别名

继续下去int &b=c;

查看abc?结果一样

4.引用和指针

引用和指针最需要注意的是用在函数和类等里面的?

要理解为什么用就得知道他们能做什么,引用和指针通俗点可以理解成去往指定地点的交通工具

现在来补充函数调用时候的特点

函数调用时候最怕的就是一顿操作猛如虎,然后把函数改的面目全非,函数哭哭戚戚表示你大爷的,所以为了防止我们的误操作?所以编译器调用函数的时候?你用的并非原本 ,而是和原本一模一样的克隆体,使用克隆体进行对应操作?之后将返回值送到寄存器,然后我们调用的函数直接接收寄存器里的东西,?当然不止给函数做了克隆体,我们调用的数据也准备了克隆体,所以我们修改的数据是克隆体的数据,克隆体满身伤痕哭哭戚戚,本体旁边看戏。?但是我们就是想改本体改怎么办呢这时候我们C++的最强工具指针和他的小弟引用登场?

指针和引用是进去目标数据地址并得到目标数据工具,函数克隆的工具人很是工具人,不会改变他们的功能,因此他们还是可以进去对原本进行操作的,所以一般函数和类里看到指针引用目的多少为了对原本进行修改,一般是修改因为光展示什么的没必要用。

晚上好啊上仙? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ---一只符华单推人
?

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-09-29 10:03:43  更:2021-09-29 10:05:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/7 18:11:56-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码