内容正文:
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;p<array+N;p++){
printf("%d ",*p);
}
9.3.2 指针与数组案例分析
案例9.3.1 指针与数组关系的应用
#include<stdio.h>
#define N 10
int main(){
int *p,array[N],i;
p = array;
for(i=0;i<N;i++){
scanf("%d",a