问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C++指针类型的概念及基本应用

创作时间:
作者:
@小白创作中心

C++指针类型的概念及基本应用

引用
1
来源
1.
https://www.bilibili.com/read/mobile?id=33776725

什么是指针?

指针是一个变量,其值为另一个变量的地址(内存中真实的地址)。就像其他变量或常量一样,必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

type* var-name;

其中:

  • type 是指针的基类型,它必须是一个有效的 C++ 数据类型
  • var-name 是指针变量的名称
  • 星号 * 用来声明指针,即用来指定一个变量是指针。

例如:

int *p; //一个整型的指针
double *p; //一个浮点型的指针
char *p; //一个字符型的指针

注意!这些指针只是所指的变量或常量的数据类型不同,但本身都只存放了内存地址,都是一个代表内存地址的十六进制数(32位中大小占4B,64位中占8B)。

什么是地址?

每一个变量都有一个内存位置,更改一个变量其实是在改变对应地址中存放的内容。&是取地址操作符,当&作用于一个对象上时,它返回了该对象的地址。

例如:

int num=3;
cout<<&num<<endl;

该程序会输出num变量的内存地址,一串十六进制数。

C++ 中应用指针

  • 声明时变量前加 "基本类型 *变量名" -------该指针变量表示另一个普通变量的地址
  • 调用时变量前加 "*" -------表示取该地址的内容(获取指针指向的变量中存放的值)
  • 调用时变量前加 "&" -------返回该变量的地址
  • 声明时变量前加 "&" -------是给某个已存在变量的起别名(该引用变量名称与原始变量名称都代表同一个变量)

NULL指针(空指针)

NULL指针的优点:

  1. 避免野指针:当一个指针没有明确指向任何有效的内存地址时,将其赋值为NULL可以避免程序访问无效的内存地址,从而避免出现未定义行为或程序崩溃。
  2. 显式表示空指针:使用NULL可以清晰地表示一个指针没有指向任何有效对象或函数,提高代码的可读性和可维护性。

一维数组和指针的关系

在C++中,一维数组可以看作是一系列相同类型的元素的集合。数组名代表数组的首地址,因此可以使用指针来访问数组中的元素。指针的 ++-- 操作符分别代表指针向后移动一个元素和向前移动一个元素,即存放后面一个元素和前面一个元素的首地址。

由于int数组每个元素占内存大小为4B,因此每次对指针进行++操作后地址往后增加4。

二维数组和指针的关系

设有二维数组: a[3][4] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};

a 数组包含 3 行:a [0],a [1],a [2]。而每一行又是一个一维数组,它包含 4 个元素 (即 4 个列元素),例如,a [0] 所代表的一维数组又包含 4 个元素: a [0][0], a [0][1], a [0][2], a [0][3]。可以认为二维数组是 “数组的数组”,即数组 a 是由 3 个一维数组所组成的。

从二维数组的角度来看,a 代表二维数组首元素的地址,现在的首元素不是一个整型变量,而是由 4 个整型元素所组成的一维数组,因此 a 代表的是首行的起始地址 (即第 0 行的起始地址,&a [0]),a+1 代表 a [1] 行的首地址,即 & a [1]。

0 行 1 列元素的地址可以直接写为 & a [0][1],也可以用指针法表示。a [0] 为一维数组名,该一维数组中序号为 1 的元素显然可以用 a [0]+1 来表示。依此类推,*(a [i]+j)或 ((a+i)+j) 是 a [i][j] 的值。

指针常量与常量指针

  • 指针常量:指针常量是指一个指针本身是常量,指针指向的内容不能被修改。*const-->指针常量
  • 常量指针:常量指针是指指针本身是可以变化的,但指针指向的内容是常量,不能被修改。const*-->常量指针

函数调用中传值、传指针、传引用

  • 传值:传值无非就是实参拷贝传递给形参,单向传递(实参->形参),赋值完毕后实参就和形参没有任何联系,对形参的修改就不会影响到实参。
  • 传地址:传地址也可以看作一种传值,因为传地址是将实参的地址拷贝传递给形参。简而言之,传地址就是将实参的地址复制给形参。传递完毕后,实参的地址和形参的地址没有联系,对形参地址的修改不会影响到实参,但是对形参地址指向的对象的修改会直接反映在实参中,因为形参指向的对象就是实参的对象。
  • 传引用:传引用实质上没有实参的拷贝,简而言之,就是让另一个变量也指向该实参(给实参起了一个别名)。也就是说,两个变量指向同一个对象。对形参的修改必然会反映到实参上。
© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号