众所周知,C++是对C语言的一个继承和扩充,所以C++可以对C语言兼容,指针(Pointer)是C语言中的一个核心内容,同样,在C++中也可以使用指针,但是,就算是一个有着多年经验的程序员,也有时候会被代码中的指针弄得晕头转向,指针可以说是C++中最不好理解的一个内容了,本文主要是针对指针的基本使用进行一个教学,读者有兴趣也可以去C++的相关网站上进行深入研究。
1.指针的语法
关于如何声明一个指针,实际上非常简单,其语法为: 类型名* 指针名;
int* p;
这样我就声明了一个整形类型的指针p,p可以用于存放整形数据的地址,比如,我现在有一个变量a,那我可以这样操作:
int a = 10;
int* p; //声明后赋值
p = &a;
//----------- // “ & ” 为取地址符
int a = 10;
int* p = &a; //在声明指针的时候对其进行赋值
这样我就将普通变量a的地址存放到了指针p中,那么现在,我进行cout << p; 这样的操作,系统就会为我们输出变量a的地址,这里有个小细节,我们可以多次运行程序,这是后会发现输出a的地址每一次都是不一样的,这是因为只有我们开时运行程序时,系统才会为我们对变量a申请内存,因此我们每一次运行程序输出a的地址都不会相同。
2.解引用操作
我们知道,指针用于存放变量的地址,那么我么如何通过指针去获取这块地址的内容呢?这就需要用到我们的“ * ”操作符进行解引用操作。
int a = 10;
int* p = &a;
cout << "a的地址为:" << p << endl;
cout << "a的值为:" << *p << endl;
这里的运行结果就是输出a的地址和输出a的值。
Tips:注意这里“ * ”的作用,只有我们在声明指针时,这里的星号表示声明变量p是一个指针,在其他情况下,星号加指针变量名都表示解引用操作,表示获取指针变量所指的内容。
3.多级指针
上述内容所讨论的都是一级指针的内容,接下来我们来讨论多级指针。
首先,在开始讨论多级指针之前,读者需要知道,指针,它也是一个普通变量,系统也会为指针分配地址,那么,多级指针实际上的作用就是去指向它上一级指针的地址,可能会有些绕,看如下代码:
int a = 10;
int* p = &a;
int** s = &p;
这里s是一个二级指针,指向一级指针p,记录的是指针p的是地址,p是一级指针,指向变量a的地址,再看看下面这个案例,读者会有更深刻的理解:
#include <iostream>
using namespace std;
int main()
{
int a = 10;
int* p = &a;
int** s = &p;
cout << "a的地址:" << p << endl;
cout << "a的地址:" << *s << endl;
cout << "p的地址:" << s << endl;
cout << "a的值为:" << *p << endl;
cout << "a的值为:" << **s << endl;
return 0;
}
运行结果如下:
这里读者应该就可以很好的理清楚指针之间的关系了。
4.指针常量和常量指针和常指针
4.1(指针常量)
指针常量实际上就是指针的指向指向不可以改变,但是指针所指的内容可以改变,指针常量的语法如下:
类型名* const 指针名;
int* const p;
这样就声明了一个指针常量,其实在C++中,有一个叫做引用的技术,其本质也是指针常量,这也是为什么当给这个引用指向一个变量后就不能在指向其他的变量了。
4.2常量指针
与指针常量相反,常量指针的指向可以随意改变,但是常量指针所指向的值不可以改变,常量指针声明的语法如下:
const 类型名* 指针名
const int* p;
4.3常指针
其实常指针就是将指针常量和常量指针结合在一起,常指针的指向和所指的内容多不可以改变,常指针声明如下:
const 类型名* const 指针名;
注意,常指针在创建的时候必须为其赋初值!
int a = 10;
const int* const s = &a;
5.指针的应用
在C++编程中,指针的使用是及其广泛的,在编程中,我们会将指针和数组相结合使用,因为数组是一段连续的内存空间,我们运用指针可以较为轻松的去对数组中的一些元素进行操作,我们在对指针进行操作时,通常会用类似p++这样的操作,这样表示将指针p向下一个内存单位移动,当我们的指针p为int类型时,p++就表示向后移动四个字节,这就是指针的数据类型的作用,如果时char型的指针,那么这个操作就将指针向后移动一个字节。
5.1 遍历输出
例如,用下列代码实现用指针遍历输出数组中的值
int a[5] = {1,2,3,4,5};
int* p = a;
for (int i = 0; i < 5; i++)
{
cout << *p << " ";
p++;
}
cout << endl;
return 0;
我们也可以将上述for循环中的语句改写为:
cout << *(p + i) << " ";
这个算是指针最简单的应用。
5.2指针最为函数形参
用指针最为函数形参可以修饰实参,实际上就是地址传递,读者可以参考作者的另一篇文章:
《C++中函数的三种不同传参方式》https://blog.csdn.net/m0_62755690/article/details/121095013?spm=1001.2014.3001.5501
5.3指针函数和函数指针
5.3.1(函数指针)
对于这一块内容,我先进行函数指针的讲解,所谓函数指针,就是指向函数的指针,声明一个函数指针的语法为:类型名 (*函数指针名)(形参列表)
当我们为函数指针赋值时,语法为:函数指针名 = 函数名
我们在使用函数指针时,语法为:函数指针名(形参列表)
看下列代码:
int func() //定义func函数
{
cout << "func函数调用!" << endl;
return 0;
}
int main()
{
int (*p)() = func; // 也可以写为 p = func
p(); //使用函数指针
return 0;
}
这就是函数指针的使用方法。
5.3.2(指针函数)
所谓指针函数,就是返回值类型为指针类型的函数,语法如下:
类型名* 函数名(形参列表)
和普通函数不同的是,指针函数可以作为表达式的左值,这是普通函数所不具备的。
函数指针用在回调函数中有重大的作用,有利于一些大型算法的数据传递,这里作者就不举例子了(因为作者在这个方面也不是很懂哈哈哈哈)
以上就是C++中指针的基本使用和概念,希望对读者有所帮助。