通过地址访问:
得到内存空间地址,直接通过地址对内存空间进行存取。
如何得到地址?
地址运算符:
&例:
intvar;则&var表示变量var在内存中的起始地址
指针变量的概念:
概念指针:
内存地址,用于间接访问内存单元指针变量:
用于存放地址的变量
指针变量声明例:
inti;int*i_pointer=&i;
i_pointer指向整型变量的指针
引用数据:
例1:
i=3;例2:
*i_pointer=3;
指针变量的初始化:
语法形式数据类型*指针名=初始地址;
例:
inta;
int*pa=&a;
int*qa=pa;
注意事项用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。
可以用一个已赋初值的指针去初始化另一个指针变量。
指针变量的赋值运算:
指针名=地址“地址”中存放的数据类型与指针类型必须相符。
向指针变量赋的值必须是地址常量或变量,不能是普通整数。
但可以赋值为整数0,表示空指针。
指针的类型是它所指向变量的类型,而不是指针本身数据值的类型,任何一个指针本身的数据值都是unsignedlongint型。
允许声明指向void类型的指针。
该指针可以被赋予任何类型对象的地址。
例:
void*general;
指针的声明、赋值与使用:
#includeusingnamespacestd;voidmain(){
int*i_pointer;//声明int型指针i_pointerinti;//声明int型数ii_pointer=&i;//取i的地址赋给i_pointeri=10;//int型数赋初值cout<<"Outputinti="<
void类型指针的使用:
voidvobject;//错,不能声明void类型的变量void*pv;//对,可以声明void类型的指针int*pint;
inti;intmain(){pv=&i;//void类型指针指向整型变量//void指针赋值给int指针需要类型强制转换:
pint=(int*)pv;}
指向常量的指针:
不能通过指针来改变所指对象的值,但指针本身可以改变,可以指向另外的对象。
例1char*name1="John";//name1是一般指针*name1='A';//编译正确,运行出错例2constchar*name1="John";//指向常量的指针chars[]="abc";name1=s;//正确,name1本身的值可以改变*name1='1';//编译时指出错误
指针类型的常量:
若声明指针常量,则指针本身的值不能被改变。
例:
char*constname2="John";name2="abc";//错误,指针常量值不能改变
#include
usingnamespacestd;
//-------------------------------------
voidmain()
{
inta=78,c=18;
constint*ip=&a;
constint*consticp=&c;
a=60;c=28;
cout<<"ip=>"<<*ip<cout<<"icp=>"<<*icp<}//==============================
指针变量的算术运算:
指针与整数的加减运算指针p加上或减去n,其意义是指针当前指向位置的前方或后方第n个数据的地址。
这种运算的结果值取决于指针指向的数据类型。
指针加一,减一运算指向下一个或前一个数据。
例如:
y=(*px)++相当于y=*(px++)
(*和++优先级相同,自右向左运算)
指针变量的关系运算:
关系运算指向相同类型数据的指针之间可以进行各种关系运算。
指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。
指针可以和零之间进行等于或不等于的关系运算。
例如:
p==0或p!
=0赋值运算向指针变量赋的值必须是地址常量或变量,不能是普通整数。
但可以赋值为整数0,表示空指针。
指向数组元素的指针:
声明与赋值例:
inta[10],*pa;pa=&a[0];或pa=a;通过指针引用数组元素经过上述声明及赋值后:
*pa就是a[0],*(pa+1)就是a[1],...,*(pa+i)就是a[i].
//Cout<a[i],*(pa+i),*(a+i),pa[i]都是等效的。
不能写a++,因为a是数组首地址是常量。
设有一个int型数组a,有10个元素。
用三种方法输出各元素:
//使用数组名和下标:
voidmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<//使用数组名指针运算:
voidmain(){inta[10];inti;for(i=0;i<10;i++)cin>>a[i];cout<//使用指针变量:
voidmain(){inta[10];int*p,i;for(i=0;i<10;i++)cin>>a[i];cout<
动态申请内存操作符new:
new类型名T(初值列表)功能:
在程序执行期间,申请用于存放T类型对象的内存空间,并依初值列表赋以初值。
结果值:
成功:
T类型的指针,指向新分配的内存。
失败:
0(NULL)
释放内存操作符delete:
delete指针P功能:
释放指针P所指向的内存。
P必须是new操作的返回值。
#include
usingnamespacestd;
voidmain()
{
int*intArray;
inteleNum;
cout<<"Pleaseinputdynamicelementnumber:
"<cin>>eleNum;
intArray=newint[eleNum];
if(intArray==NULL)
{
cout<<"OVERFLOW!
"<return;
}
for(inti=0;i{
*(intArray+i)=i*2;
}
//
for(i=0;i{
cout<<*(intArray+i)<}
delete[]intArray;
}
动态存储分配函数:
void*malloc(size);参数size:
欲分配的字节数返回值:
成功,则返回void型指针。
失败,则返回空指针。
头文件:
动态内存释放函数:
voidfree(void*memblock);参数memblock:
指针,指向需释放的内存。
返回值:
无头文件:
#include
#include
usingnamespacestd;
voidmain()
{
int*intArray;
inteleNum;
cout<<"Pleaseinputdynamicelementnumber:
"<cin>>eleNum;
intArray=(int*)malloc(eleNum*sizeof(int));
if(intArray==NULL)
{
cout<<"OVERFLOW!
"<return;
}
for(inti=0;i{
*(intArray+i)=i*2;
}
//
for(i=0;i{
cout<<*(intArray+i)<}
free(intArray);
}
引用类型:
当需要给某个变量取个别名,用别名去操作这个变量时,就必须要使用引用类型。
引用的定义:
引用必须初始化,因为引用总是附属于某个实体
intsomeInt=5;
int&rInt=someIne;//初始化
修改引用的值,即是修改了附属的实体值
inta=5;
int&ra=a;
ra=8;
cout<结果为:
8
#include
usingnamespacestd;
//-------------------------------------
voidmain()
{
intint1=5;
int&rInt=int1;
cout<<"&int1:
"<<&int1<<"int1:
"<cout<<"&rInt:
"<<&rInt<<"rInt:
"<intint2=8;
rInt=int2;
cout<<"&rInt:
"<<&rInt<<"rInt:
"<}//=================
20
20
10
10
20
10
10
10
10
20
教学重点与难点
重点一:
内存地址和指针的概念理解;
重点二:
指针访问数组元素的方法;
重点三:
引用概念理解及其使用方法;
讨论、练习、作业
在教学辅助系统中阅读程序f0312~f0315;
教学手段
演示例程的运行,指导学生阅读代码,引出理论知识点,结合多媒体课件进行讲解
参考资料
《C++程序设计教程(第二版)》,钱能,清华大学出版社;
《C++面向对象程序设计》,谭浩强,清华大学出版社
《C++语言程序设计(第4版)》,郑莉,清华大学出版社