第5章 指 针 教学目标: 掌握指针定义、初始化方法和基本运算; 掌握利用指针访问一维数组、二维数组的方法; 第5章 指 针 教学目标: 掌握指针定义、初始化方法和基本运算; 掌握利用指针访问一维数组、二维数组的方法; 掌握内存的动态分配、释放方法,并实现对动态数组的访问; 理解指针与字符串之间的关系,能用指针操作字符串。 2011.10
第5章 指 针 5.1 问题引出 5.2 指针变量的定义及使用 5.3指针与数组 5.4指针与字符串 2011.10
5.1 问题引出 问题:&a[i], a的含义? 结论:地址 &a[i] a为数组的首地址 a[i]为元素 回顾 例4.1 定义一个一维数组,实现元素的基本输入、输出。 #include <iostream.h> const int Maxsize=100; void main( ){ int i,n=5; int a[Maxsize]; //input for(i=0;i<n;i++) cin>>a[i]; //display cout<<n<<" numbers: "; for (i=0;i<n;i++) cout<<a[i]<<" "; cout<<endl; } 问题:&a[i], a的含义? 结论:地址 &a[i] a为数组的首地址 a[i]为元素 2011.10
5.2 指针变量 例题 (1) double f; f=9.6; (2) double * p; (3) p=&f; 指针变量的定义 格式: 基类型 * 指针变量名; 例题 (1) double f; f=9.6; (2) double * p; (3) p=&f; (1) 定义实型变量f,系统为其分配能够存储一个实数所占的内存空间 (2) 定义指向实型数据的指针变量, 即系统为变量p分配存储空间,用来存储某一实数所占内存空间的地址 (3) 变量f的地址赋值给变量p。 一般称变量p指向f,即将一个通过 变量f申请的内容地址赋值给p。 2011.10
5.2 指针变量 例题 (1) double f; (2) double * p; (3) p=&f; 图示 结论 f值的访问:f或*p 2011.10
5.2 指针变量 例题 int i=5,j=7; double f=9.6; double *p=&f; 2011.10
5.2 指针变量 二级指针(指向指针的指针变量) (1)定义指向指针的指针变量的方式 类型 ** 指针变量名 举例: 类型 ** 指针变量名 举例: double a=10.0, *p1=&a; double **p2; p2=&p1; 结论:(1) 值访问:a,*p1,**p2 (2)地址访问: *p2,p1,&a 2011.10
s 5.3 指针与数组 利用指针变量实现对一维数组的访问 例: int s[Maxsize]; 元素访问:s[i], *(s+i) int *p=s; p++; 2011.10
5.3 指针与数组 利用指针变量实现对一维数组的访问 #include <iostream.h> const int Maxsize=100; void main(){ int *p,*max,s[Maxsize]; int n=10; cout<<"Enter "<<n<<" numbers:\n"; for(p=s;p<s+n;p++) cin>>*p; for(p=s;p<s+n;p++) cout<<*p<<" "; max=s; if(*max<*p) max=p; cout<<"\nThe maximum number: "<<*max<<endl; } 2011.10
5.3 指针与数组 利用指针变量实现对二维数组的访问 若有int a[3][4]; 则 元素值的访问方式:a[i][j], *(a[i]+j),*(*(a+i)+j) 元素地址的访问方式:&a[i][j], (a[i]+j),*(a+i)+j 2011.10
5.3 指针与数组 利用指针变量实现对二维数组的访问 //二维数组输入、输出(含地址输出) #include<iostream.h> void main(){ int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}, i, j; cout<<"a[i][j] address value\n"; cout<<"---------------------------\n"; for(i=0; i<3; i++) for(j=0; j<4; j++) cout<<"a["<<i<<"]["<<j<<"] " <<&a[i][j]<<" "<<a[i][j]<<endl; } 2011.10
5.3 指针与数组 利用指针变量实现对二维数组的访问 //二维数组输入、输出(含地址输出) #include<iostream.h> void main(){ int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}, i, j; int *p=*a; cout<<"a[i][j] address value\n"; cout<<"---------------------------\n"; for(i=0; i<3; i++) for(j=0; j<4; j++){ cout<<"a["<<i<<"]["<<j<<"] "<<p<<" "<<*p<<endl; p++; } 2011.10
5.3 指针与数组 利用指针变量实现对二维数组的访问 #include<iostream.h> void main(){ int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}, i, j; int *p1; //定义列指针变量 int (*p2)[4]; //定义行指针变量 p1=&a[0][0]; //用列指针给列指针变量赋初值 cout<<"Method one:\n"; for(i=0; i<3; i++){ for(j=0; j<4; j++) cout<<*p1++<<"\t"; //用列指针访问数组元素 cout<<endl; } p2=a; //用行指针给行指针变量赋初值 cout<<"Method two:\n"; cout<<*(*(p2+i)+j)<<"\t";//用行指针访问数组元素 2011.10
5.3 指针与数组 利用行指针、列指针实现对二维数组元素的访问 #include<iostream.h> void main(){ int a[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}}, i, j; int *p1; //定义列指针变量 int (*p2)[4]; //定义行指针变量 cout<<"Method three:\n"; p2=a; //此语句可以删除; for(i=0; i<3; i++) { for(j=0; j<4; j++) cout<<*(*p2+j)<<"\t"; //用行指针访问数组元素 p2++; //强调行指针做自增运算时是如何操作的 cout<<"\n"; } cout<<"Method four:\n"; p2=a; //此语句不可以删除; for(i=0; i<3; i++){ cout<<p2[0][j]<<"\t"; //用行指针访问数组元素 2011.10
5.4 动态数组与动态内存分配 动态内存分配 例题:动态分配存储n个数据的数组,并实现数据的输入、输出。 #include <iostream.h> void main(){ int i,n; int *s; cout<<"Enter the count:\n"; cin>>n; s=new int[n]; cout<<"Input "<<n<<" data:\n"; for(i=0;i<n;i++) cin>>s[i]; cout<<s[i]<<"\t"; cout<<endl; delete [ ]s; } 2011.10
5.4 动态数组与动态内存分配 例题:动态分配存储n个数据的数组,并实现数据的输入、输出。 #include <iostream.h> void main(){ int i,n; int *s; cout<<"Enter the count:\n"; cin>>n; s=new int[n]; //为s申请内存 cout<<"Input "<<n<<" data:\n"; for(i=0;i<n;i++) cin>>s[i]; //输入 cout<<s[i]<<“\t”; //输出 cout<<endl; delete [ ]s; //释放s所指内存 } 2011.10