9.3 指针与数组 课件(共17张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源下载
  1. 二一教育资源

9.3 指针与数组 课件(共17张PPT)-《C语言程序设计》同步教学(西安电子科技大学出版社)

资源简介

(共17张PPT)
C 语言程序设计
2023
翻转课堂实用教程
9.3 指针与数组
1
2
3
采用指针访问数组
指针间的比较运算
知识点
指针与数组案例分析
案例分析
指针与数组
相关练习题
练习题
9.3.1 指针与数组知识点
数组名:数组的首地址,第一个元素的地址。
若数组array元素类型为Type,则array值就和&array[0]一致,array的类型为Type*类型的指针常量。
系统在为数组分配一块连续的内存空间后,数组的首地址就已经确定了,除非销毁,不会改变,所以为指针常量。
为什么数组名是一个指针常量?
9.3.1 指针与数组知识点
举例:
int *p, array[5] = {30,20,50,10,40};
p = array;
p的值为&array[0],*p 为 array[0]
p+i表示相对于当前指针p往后偏移i个整数的位置
(1)采用指针访问数组
array[0] array[1] array[2] array[3] array[4]
30 20 50 10 40
array array+1 array+2 array+3 array+4
p p+1 p+2 p+3 p+4
9.3.1 指针与数组知识点
(1)采用指针访问数组
采用指针获取数组元素、地址的方式
元素获取内容 array[0] array[1] array[2] array[3] array[4]
获取元素的值 array[0] *array *p p[0] array[1] *(array+1) *(p+1) p[1] array[2] *(array+2) *(p+2) p[2] array[3] *(array+3) *(p+3) p[3] array[4]
*(array+4)
*(p+4)
p[4]
获取元素的地址 &array[0] array p &array[1] array+1 p+1 &array[2] array+2 p+2 &array[3] array+3 p+3 &array[4]
array+4
p+4
参见9.3.2章节中案例9.3.1的代码及运行结果
数组名可以作为指针来使用,指针变量可以作为数组形式来使用。
9.3.1 指针与数组知识点
(1)采用指针访问数组
指针变量与数组名,两者有什么区别呢?
(1)p为指针变量,数组array是指针常量。
p = array+i,
array = array + i。
(2)作为sizeof运算符的操作数时
sizeof(array):为array所代表的整个数组占用的总字节数。
sizeof(p):为p指针占用的字节数
数组名不可以作为赋值=左边的操作数。
9.3.1 指针与数组知识点
(1)采用指针访问数组
举例:
int array[5] = {30,20,50,10,40},*p = array+2;
p-1 是?
p+2是?
利用指针p,可以随机从某一个元素开始往前往后访问数组元素。
array[2]前面一个元素,p-1 为 &array[1]
p+2 为 &array[4]
9.3.1 指针与数组知识点
(2)指针间的比较运算
当两个指针均指向同一个数组中的元素时,两个指针可以进行两类运算:
关系运算: > < ≠
相减的运算
9.3.1 指针与数组知识点
(2)指针间的比较运算
举例:
int array[5] = {30,20,50,10,40};
int *p1 = &array[3], *p2 = array, *p;
30 20 50 10 40
array
p1
p2
① 以下式子成立:
p1 > p2、p2 < p1、p1≠p2
p1-p2 为 3
基于上面的比较运算,使用指针p作为循环变量,p:[array,&array[4]],p++,可以遍历数组array的所有元素。
for(p=array;p<=&array[N-1];p++){
printf("%d ",*p);
}

for(p=array;pprintf("%d ",*p);
}
9.3.2 指针与数组案例分析
案例9.3.1 指针与数组关系的应用
#include
#define N 10
int main(){
int *p,array[N],i;
p = array;
for(i=0;iscanf("%d",array+i);
}
//输出元素的地址,每两个一行
for(i=0;iprintf("%#X ",(array+i));
if((i+1)%2 == 0 && i!=9) printf("\n");
}
printf("\n");
//三种通过p指针来获取元素值的代码
for(i=0;iprintf("%d ",*(p+i));
}
printf("\n");
for(i=0;iprintf("%d ",p[i]);
}
printf("\n");
for(p=array;p<=&array[N-1];p++){
printf("%d ",*p);
}
return 0;
}
运行结果:
23 10 4 5 8 9 13 57 28 61↙
0X62FDE0 0X62FDE4
0X62FDE8 0X62FDEC
0X62FDF0 0X62FDF4
0X62FDF8 0X62FDFC
0X62FE00 0X62FE04
23 10 4 5 8 9 13 57 28 61
23 10 4 5 8 9 13 57 28 61
23 10 4 5 8 9 13 57 28 61
9.3.2 指针与数组案例分析
案例9.3.2 编写函数求解数组a中的最大元素值,并验证函数的正确性。
#include
/*入参int a[]等价与 int *a,为一个整型指针变量*/
int getMin( int a[],int n){ /*等价于int getMin( int *a,int n)*/
int i,min = a[0];
for(i=1;iif(min > a[i]) min = a[i];
}
return min;
}
int main(){
int array[9] = {3,5,2,9,6,8,7,4,0};
//数组名a为整数指针常量,作为getMin的第一个实际参数,将a的首地址传进去
printf("getMin is %d",getMin(array,9));
return 0;
}
运行结果:
getMin is 0
9.3.2 指针与数组案例分析
案例9.3.2 编写函数求解数组a中的最大元素值,并验证函数的正确性。
#include
/*入参int a[]等价与 int *a,为一个整型指针变量*/
int getMin( int a[],int n){ /*等价于int getMin( int *a,int n)*/
int i,min = a[0];
for(i=1;iif(min > a[i]) min = a[i];
}
return min;
}
int main(){
int array[9] = {3,5,2,9,6,8,7,4,0};
//数组名a为整数指针常量,作为getMin的第一个实际参数,将a的首地址传进去
printf("getMin is %d",getMin(array,9));
return 0;
}
运行结果:
getMin is 0
9.3.2 指针与数组案例分析
案例9.3.3 使用指针操作数组的案例分析
要求:分析下面的代码,理解数组名作为函数参数,转化为同类型指针的用法。
#include
int getMin( int a[],int n){
int i,min = a[0];
for(i=1;i a[i]) min = a[i]; }
return min;
}
int main(){
int array[9] = {3,5,2,9,6,8,7,4,0},*p = array;
printf("getMin is %d\n",getMin(array,9));
printf("getMin is %d\n",getMin(p+2,4));
printf("getMin is %d\n",getMin(&array[4],3));
return 0;
}
/*入参int a[]等价与int *a,为一个整型指针变量。该函数的功能是求解从a位置到a+n-1位置上元素中的最小值*/
/*传入的实参为数组array的首地址,包括9个元素,即计算a[0]、a[1]...a[8]中的最小值*/
/*传入的实参为数组array[2]的地址,包括4个元素,即计算a[2]、a[3]、a[4]、a[5]中的最小值*/
9.3.3 指针与数组课堂练习题
课堂练习题9.3.1:写出执行下面程序后的输出结果
#include
int main(){
int i;
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p,*p1 = a,*p2 = a+3;
printf("*p1 = %d,a[0] = %d\n",*p1,a[0]);
printf("*p2 = %d,a[3] = %d\n",*p1,a[3]);
printf("p2-p1 = %d\n",p2-p1);
printf("*(p1+2) = %d\n",*(p1+2));
p2++;
if(p2 == &a[3])
printf("p2 == a[3]的地址");
else
printf("p2 不等于 a[3]的地址");
return 0;
}
9.3.3 指针与数组课堂练习题
课堂练习题9.3.2:写出执行下面程序后的输出结果
#include
int main(){
int i;
int a[10] = {1,2,3,4,5,6,7,8,9,0};
int *p,*p1,*p2;
p1 = &a[2],p2 = a+9;
for(p = p1;p<=p2;p++){
printf("%d ",*p);
}
printf("\n");
for(p = a,i=0;i<6;i++){
printf("%d ",p[i]);
}
return 0;
}
课堂练习题9.3.3:定义函数,采用传递数组指针的方式求解阶乘
谢谢观看
程序设计基础

展开更多......

收起↑

资源预览