C++语言解读
本章共分
一:指针
二:引用
三:函数深入
四:运算符重载
五:C++中的继承
六:虚函数
七:链表
八:多态性
九:代码重用
一:指针
1:什么是指针
2:用指针怎么保存地址
3:空指针
4:指针与类型
5:用指针访问值
6:指针容易混淆的概念
7:指针的算术
8:指针与数组
9:栈与堆得概念(指针的new)
10:用指针创建对象
11:常量指针
12:指向常量的指针
1.1 什么是指针
指针是一种专门保存变量地址的变量
怎么定义指针 请看例子
using namespace std;
//定义指针
int main(){
int* p;//这里定义一个指向int类型的指针,也可以int *p这样定义
return 0;
}
1.2 用指针怎么保存地址
using namespace std;
//用指针怎么保存地址
int main(){
int a=30;
int* p=&a;// &运算符是取地址运算符(任何类型都可以用&取地址)
cout<<"p:"<<p<<endl; //输出P保存的地址
cout<<"&a:"<<&a<<endl;//同样输出&a地址查看
return 0;
//输出结果大致为
//p:0012ff7c
//&a:0012ff7c
}
那么怎样用指针访问值呢?下面会解答
3:空指针
大家必须要记住一点:使用指针必须初始化.如果暂时不知道把指针指向什么地方,可以用0来初始化该地
址。这样就不会出现意料不到的地方
using namespace std;
//空指针
int main(){
int* p=0;
return 0;
}
4:指针与类型
使用指针初始化时变量类型必须与指针指向的类型相同。请看代码
using namespace std;
//指针类型
int main(){
int a=30;
double b=20.4;
int* p=&a; //正确
int* p=&b; //错误,类型不正确
return 0;
}
5:用指针访问值
用指针怎么访问值呢?请看代码
using namespace std;
//指针访问值
int main(){
int a=30;
int* p=&a;
cout<<*p<<endl;//请注意:这里的*是运算符重载(间接引用,而非定义指针或乘法运算)
return 0;
}
6:指针容易混淆的概念
指针有3个概念会大家混淆
1: 指针自身的地址
2:指针所保存的地址
3:指针所保存地址的值
还是用例子来说明
using namespace std;
//指针容易混淆的概念
int main(){
int a=30;
int b=20;
int* p=&a;
cout<<"p自身地址:"<<&p<<endl;//输出p自身的地址
cout<<"p指向的变量地址:"<<p<<endl;//p指向变量的地址
cout<<"*p值:"<<*p<<endl;//输出值
p=&b;
cout<<"改变指针指向后输出指针自身地址:"<<&p;
return 0;
/*
输出结果如下
p:自身地址:0012ff74
p指向的变量地址:0012ff7c
*p的值:30
改变指针指向后输出指针自身地址:0012ff74
*/
}
大家可以看见,无论如何定义指针指向,指针本身地址不会再次改变呢
7:指针的算术
指针算术有一点点不同,请看例子
using namespace std;
//指针的算术
int main(){
int a=30;
int*p=&a;
cout<<"p:"<<p<<endl;
p++;//自加1
cout<<"p:"<<p<<endl;
return 0;
/*
输出
p:0012ff7c;
p:0012ff80;
*/
}
我们可以用十六精制计算器两个输出两个对象相减会发现差值是4而不是1,这个4是什么?和int型有何联系??请大家自行测试
8:指针与数组
指针和数组有太大的关系,我们可以说数组就是指针,指针就是数组。为什么这么说呢?因为大部分情况下数组名保存的就是一个地址。请看例子代码
using namespace std;
//指针与数组
int main(){
int shu[]={1,2,3,4,5};
cout<<shu<<endl;//直接输出数组名
int*p=shu;
cout<<p<<endl;//输出地址
cout<<"指针访问数组元素:"<<p[1]<<endl;
cout<<" 数组名访问数组元素:"<<shu[1];
cout<<"这里输出是什么?:"<<(*p)<<endl;
cout<<"这里输出和上面一行和何联系呢?:"<<p[0]<<endl;
p++;
cout<<p<<endl;//这里进行自加后会输出什么
cout<<&(p[1])<<endl;//这里输出和上面一行有何联系??
return 0;
/*
*/
}
我们可以得出个结论,数组名保存的是数组第一个值的地址,当指针自加1后,实际上是加了该类型的字节数,这样指指自加就等于是指向下一个数组元素.关于数组和指针还有很多联系,我们将到数组时会具体介绍
9:栈与堆得概念
这个概念如果不介绍的话,下面的话题会有所不了解的。关于变量存储的位置分很多,我们这里就说栈与堆。
栈位置是什么: class a;//这种形式存储a变量的地址就是放在栈里面的,栈里面数据是自动回收的.不需要我们手动回收
堆位置是什么: class* p=new class;//这种形式就是存放在堆里面。堆有点不同的是它不会自动回收,我们必须手工进行释放。
怎么释放:delete p;注意一点,用new 关键字在进行创建对象时必须要delete释放.这点和我们所学的C#不同,C#是垃圾自动回收机制的.
为了测试这个意思。我们可以写个例子来说明
class a{
public:
a(){cout<<"构造触发了";}
~a(){cout<<"析构触发了";}
}
大家可以定义两个对象
a aa;
a* p=new a;来进行这样的测试就会发现不同点呢。
明天继续
浙公网安备 33010602011771号