指针,是C++中最强大的功能之一
曾经的我年少轻狂,不知道指针的妙处,只喜欢与结构体为伴
上了大学后,老师先用class生生地让我与结构体分离,之后又塞给我指针的安利。。。
废话不多说,下面就xue微介绍一下指针这种奇技淫巧
指针变量的声明和初始化
指针是什么
指针变量把内存地址作为ta的值
这和普通的变量有什么区别吗?
通常,一个变量直接包含一个值,但是指针变量包含了变量的内存地址,而该变量又包含了一个值(能理解吧)
因此从这个意义上来讲,变量直接引用一个值,而指针间接引用一个值
我们一般在示意图中将指针表示为从一个变量指向另一个变量的箭头
第一个变量存储的是一个地址,第二个变量存储的就是值了
指针的声明
直接地,看代码?看代码!
int *countPtr,count;
在这个短短的一行定义中,我们定义了两种不同的变量
c
o
u
n
t
P
t
r
countPtr
countPtr是
i
n
t
∗
int *
int∗类型,指向
i
n
t
int
int的一个指针
c
o
u
n
t
count
count是一个
i
n
t
int
int类型的变量
很简单吧~
指针的初始化
我们在定义int类型的时候,就会发现一个问题:
新定义的int类型变量的初始值是无法确定的(可能是一个任意整数)
那么新定义指针的初始值是什么呢?
指针在声明或赋值的时候,应该被初始化为nullptr,或者一个相应类型的地址
一个值为nullptr的指针“指向空”,被称为空指针
那么什么是空指针
在早期C++中,把空指针赋值为0或者NULL
把一个指针定义为0和把一个指针定义为NULL是等价的
但是C++11后我们按照惯例初始化维0
0是唯一一个可以直接给指针赋值的整数,不需要强制转为指针类型
指针运算符
地址运算符&
怎么用?这么用!
int y=5;
int *yptr=bullptr;
yptr= &y;
经过了这三行骚操作后,
y是一个int类型变量,值为5
yptr是一个指向int的指针类型,一开始初始化为空指针
之后通过一个&运算符,将y这个int类型的地址赋值给yptr,yptr就可以间接引用y啦
间接运算符*
用一个简单的小程序讲明白这个运算符:
#include<iostream>
using namespace std;
int main()
{
int y;
int *yptr=nullptr;
cout<<"Enter y : ";
cin>>y;
cout<<"y = "<<y<<endl;
cout<<"Enter again : ";
yptr= &y;
cin>> *yptr; //注意这里的写法
cout<<"Now y = "<<y<<endl; //y
cout<<"What about *yptr ? *yptr = "<<*yptr<<endl; //*yptr
system("pause");
return 0;
}
在这个程序中,首先
int *yptr=nullptr;
定义yptr并且把ta初始化为NULL空指针
yptr= &y;
之后将其定义为指向整型y的一个指针
cin>> *yptr;
cout<<"What about *yptr ? *yptr = "<<*yptr<<endl;
在将yptr重新定义后,我们只需要在yptr前加一个 “ * ” ,效果就和直接调用y一样啦
注意:
- 如果缺少
yptr= &y;
,程序会报错- 我们在先定义y的前提下,可以直接将yptr指向y
int y; int *yptr= &y;
- 在指针左侧添加 “ * ”,表示调用ta所指向的变量的值,但是这和定义指针时使用的 “ * ” 是有区别的
使用地址运算符&和间接运算符*
#include<iostream>
using namespace std;
int main()
{
int a=7;
int *aPtr= &a;
cout<<"The address of a is "<< &a <<endl;
cout<<"The value of aPtr is "<< aPtr <<endl;
cout<<"\nThe value of a is "<< a <<endl;
cout<<"The value of *aPtr is "<< *aPtr <<endl;
system("pause");
return 0;
}
使用指针的按引用传递方式
下面写一个计算立方的简单程序
这个是一般的写法(简直不要太简单):
#include<iostream>
using namespace std;
int cubeByValue(int);
int main()
{
int n;
cout<<"The original value of number is ";
cin>>n;
cout<<"The new value of number is "<<cubeByValue(n)<<endl;
system("pause");
return 0;
}
int cubeByValue(int n) { //三次方
return n*n*n;
}
上面就是按值传递方式
那么我们要是用按指针传递方式来编程呢?
#include<iostream>
using namespace std;
void cubeByReference(int *); //传递的是一个指针(地址)
int main()
{
int n;
cout<<"The original value of number is ";
cin>>n;
cubeByReference( &n ); //用&取n的地址传入
cout<<"The new value of number is "<<n<<endl;
system("pause");
return 0;
}
void cubeByReference(int *nptr) { //三次方
*nptr= *nptr * *nptr * *nptr; //左加*,引用指针指向的int变量
}
用几张图展示我们的程序到底干了些什么: