1、什么是地址
# include <iostream>
using namespace std;int main()
{
int i;
cout<<&i<<endl;
//获取变量i的内存地址
return 0;}
输出结果:
0012FF44
2、用指针来保存地址
# include <iostream>
using namespace std;
int main()
{
int i;
int *p;
p=&i;
//指针就是用来保存内存地址的变量
cout<<"&i:"<<&i<<endl;
cout<<"p:"<<p<<endl;
return 0;
}
运行结果:
&i:0012FF44
p:0012FF44
3、空指针
# include <iostream>
using namespace std;
int main()
{
int *p=0;
//定义了一个指针就要对其赋值,如果不赋值就要初始化,否则指针会随意指向一个数据,并对其修改,这样是非常可怕的。
cout<<"p:"<<p<<endl;
//00000000这个数据不会存放任何数据,我们大可以放心。
return 0;
}
运行结果:
p:00000000
4、指针与类型
# include <iostream>
using namespace std;
int main()
{
double a=3.14;
int i=3;
double *p1=&a;
int *p2=&i;
cout<<"p1:"<<p1<<endl;
cout<<"p2:"<<p2<<endl;
p1++;
p2++;
cout<<endl;
cout<<"p1:"<<p1<<endl;
cout<<"p2:"<<p2<<endl;
//我们不能用一种类型的指针付给另一种类型的地址
return 0;
}
运行结果:
p1:0012FF40
p2:0012FF3C
p1:0012FF48
p2:0012FF40
5、用指针来访问值
# include <iostream>
using namespace std;
int main()
{
int i=3;
int *p;
p=&i;
cout<<"*p:"<<*p<<endl;
cout<<"i:"<<i<<endl;
cout<<"p:"<<p<<endl;
cout<<"&i:"<<&i<<endl;
return 0;
}
运行结果:
*p:3
i:3
p:0012FF44
&i:0012FF44
6、容易混淆的概念
# include <iostream>
using namespace std;
int main()
{
int i;
int *p=0;
cout<<"i的地址:"<<&i<<endl;
cout<<"p的值:"<<p<<endl;
cout<<"p的内存地址:"<<&p<<endl;
i=3;
cout<<"i的地址:"<<&i<<endl;
p=&i;
cout<<"p的值:"<<p<<endl;
cout<<"p的内存地址:"<<&p<<endl;
return 0;
}
运行结果:
i的地址:0012FF44
p的值:00000000
p的内存地址:0012FF40
i的地址:0012FF44
p的值:0012FF44
p的内存地址:0012FF40
7、指针对数值的操作# include <iostream>
using namespace std;
int main()
{
typedef unsigned short int ut;
//用typedef定义了一个ut,ut可作为一个数据类型使用!
ut i=9;
ut *p=0;
p=&i;
cout<<"i:"<<i<<endl;
cout<<"*p:"<<*p<<endl;
cout<<"用指针修改i中的值..."<<endl;
*p=90;
cout<<"i:"<<i<<endl;
cout<<"*p:"<<*p<<endl;
cout<<"用i修改i中的值..."<<endl;
i=900;
cout<<"i:"<<i<<endl;
cout<<"*p:"<<*p<<endl;
return 0;
}
运行结果:
i:9
*p:9
用指针修改i中的值...
i:90
*p:90
用i修改i中的值...
i:900
*p:900
8、更换指针保存的地址
# include <iostream>using namespace std;
int main()
{
int i=0;
int j=1;
int *p=0;
p=&i;
cout<<"i:"<<"\t"<<i<<endl;
//"\t的目的就是中间对其"
cout<<"&i:"<<"\t"<<&i<<endl;
cout<<"j:"<<"\t"<<j<<endl;
cout<<"&j:"<<"\t"<<&j<<endl;
cout<<"*p:"<<"\t"<<*p<<endl;
cout<<"p:"<<"\t"<<p<<endl;
p=&j;
cout<<"更换地址以后...."<<endl;
cout<<"i:"<<"\t"<<i<<endl;
cout<<"&i:"<<"\t"<<&i<<endl;
cout<<"j:"<<"\t"<<j<<endl;
cout<<"&j:"<<"\t"<<&j<<endl;
cout<<"*p:"<<"\t"<<*p<<endl;
cout<<"p:"<<"\t"<<p<<endl;
return 0;
}
运行结果:
i: 0
&i: 0012FF44
&j: 0012FF40
*p: 0
p: 0012FF44
更换地址以后....
i: 0
&i: 0012FF44
&j: 0012FF40
*p: 1
p: 0012FF40
9、指针的运算
指针的加减运算
# include <iostream>
using namespace std;
int main()
{
int *p=new int;
cout<<"指针p保存的空间地址为:"<<"\t\t\t"<<p<<endl;
p++;
cout<<"p进行自加后,指针p保存的空间地址为:"<<"\t"<<p<<endl;
p--;
cout<<"p进行自减后,指针p保存的空间地址为:"<<"\t"<<p<<endl;
p=p-2;
cout<<"p进行p-2后,指针p保存的空间地址为:"<<"\t"<<p<<endl;
return 0;
}
运行结果:
指针p保存的空间地址为: 00642958
p进行自加后,指针p保存的空间地址为: 0064295C
p进行自减后,指针p保存的空间地址为: 00642958
p进行p-2后,指针p保存的空间地址为: 00642950
指针的赋值运算
# include <iostream>
using namespace std;
int main()
{
int *p=new int;
int *p1=new int;
cout<<"p:"<<p<<endl;
cout<<"p1:"<<p1<<endl;
p=p1;
//将一个指针保存的地址付给另外一个指针
cout<<"赋值后..."<<endl;
cout<<"p:"<<p<<endl;
return 0;
}
运行结果:
p:00622958
p1:00622990
复制后...
p:00622990
指针的相减运算
# include <iostream>
using namespace std;
int main()
{
int *p=new int;
int *p1=new int;
int i;
cout<<"p:"<<p<<endl;
cout<<"p1:"<<p1<<endl;
i=p-p1;
//两块内存地址相减后,是一个整数,我们可以把相减后的值付给i
cout<<"两块内存的地址差:"<<endl;
cout<<i<<endl;
return 0
}
运行结果:
p:00282958
p1:00662990
两块内存的地址差:
14
指针的比较运算
# include <iostream>
using namespace std;
int main()
{
int *p=new int;
int *p1=new int;
cout<<"p:"<<p<<endl;
cout<<"p1:"<<p1<<endl;
if(p>p1)
{
cout<<"p大于p1的内存地址!"<<endl;
}
else
cout<<"p小于p1的内存地址!"<<endl;
return 0;
}
运行结果:
p:00282958
p1:00662990
p小于p1的内存地址!10、常量指针
程序一:
# include <iostream>
using namespace std;
int main()
{
int i=3;
int *const p=&i;
//加上const就构成了指针常量,指针常量自身的值不能改变,但是它所指向的目标的值是可以改变的。
//指针常量必须开始就要初始化,比如 int *const p; p=&i; 是不对的,要写成一行
cout<<i<<endl;
i=4;
cout<<i<<endl;
//p++这个操作是错误的,指针常量自身的值不能改变,不能进行运算
return 0;
}
运行结果:
3
4
程序二: