8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)

| 25页
| 78人阅读
| 10人下载
普通

内容正文:

第 8 章 指针 2024年8月11日 内容概述 1.指针变量的概念、特点、定义和使用方法。 2.数组与指针的关系,包括一维数组和指针、字符串与指针等。 3.指针变量作函数参数、指向数组的指针作函数的参数。 2024年8月11日 教学目标 1.掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。 2.掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量 。 3.熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。 4. 了解指针与字符串的关系,能熟练使用指针处理字符串。 5.熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。 2024年8月11日 C语言中,变量是有类型的,而且占据一定长度的内存单元。 通过前面的学习,我们已知道: 例如: char ch; 变量ch占用1个字节的存储单元 int n; 变量n占用4个字节的存储单元 float x; 变量x占用4个字节的存储单元 double f; 变量f占用8个字节的存储单元 2024年8月11日 既然变量占据一定的内存空间,那么每一个变量都对应一个内存地址,这个地址为无符号整数,它不同于一般的整数。 问题: 能否对地址运算?  能否用一个变量保存地址? 2024年8月11日 8.4用指针访问一维数组 8.4.1指针与数组的关系 1、数组的指针: 数组的起始地址(即数组名)。是一个恒定值指针。 2、数组元素的指针: 数组元素的地址。 3、指向数组的指针变量: 用于存放数组的起始地址或某一数组元素地址的变量。 2024年8月11日 8.4.2 指向数组的指针变量的定义 1、定义方法 具体定义方法与一般指针变量的定义方法相同。 例如: int a[10]; int *p; C语言规定: 数组a的首地址即可用&a[0]表示,亦可用a表示。所以:p=&a[0];和p=a;等价,都表示把数组a的首地址赋给指针变量p 2、对指针变量p可进行初始化赋值。 例如:int a[10]; int *p=a; 或 int *p=&a[0]; a[0] a a[1] a[2] a[9] p a[i] p+1 p+2 p+i p+9 2024年8月11日 8.4.3 利用指针访问数组 1、作用 引用数组元素可以用下标法,还可以用指针法。使用指针方法能使目标程序的质量占内存少、运行速度快。 2、基本方法 1)将指针指向数组中的某个元素; 2)利用*(p + n)获得数组元素的值。 如: int a[9]={0,1,2,3}; int *p=a; printf(“%d”,*p); printf(“%d”,*p++); printf(“%d”,*p--); a[0] *(p+n-1) a a[1] a[2] a[n-1] p++ p++ p=a a[i] p+i或a+i p+n-1 *(p+i) 或p[i] 2024年8月11日 for(i=0;i<10;i++) scanf("%d",&a[i]); for(p=a,i=0;i<10;i++) scanf("%d",p+i); for(p=a;p<a+10;p++) scanf("%d",p); for(i=0;i<10;i++) scanf("%d",&p[i]); for(i=0;i<10;i++) scanf("%d",a+i); 可以用以下方法输入数组a的内容。 方法一: 方法二: 方法三: 方法四: 方法五: 2024年8月11日 可以用以下方法输出数组a的内容。 方法一: for(i=0;i<10;i++) printf("%d",a[i]); 方法二: for(i=0;i<10;i++) printf("%d",*(a+i)); 方法三: for(i=0;i<10;i++) printf("%d",p[i]); 方法四: for(p=a;p<a+10;p++) printf("%d",*p); 方法五: for(p=a,i=0;i<10;i++) printf("%d",*(p+i)); 2024年8月11日 下面这段程序能输出数组a的10个元素值吗? main() { int i,a[10],*p=a; for(;p<a+10;p++) scanf("%d",p); for(;p<a+10;p++) printf("%d",*p); } 练习:下面的程序的输出结果是什么? #include <stdio.h> int a[]={2,4,6,8}; main() { int i,*p=a; for(i=0;i<4;i++) a[i]=*p++; printf(“%d ”,a[2]); } 运行结果为:6 2024年8月11日 3. 引用一个数组元素的两种方法: (1)下标法:如a[i]形式; (2)指针法:如*(a+i)或 *(p+i)。 关于用指针方法引用数组元素,是一个重点,也是一个难点,为了方便大家理解,特制表格,见下页。 2024年8月11日 若有数组及指针定义 int a[5],*p=a; 下标法: a[0] a[1] a[2] a[3] a[4] 指针法: *p *(p+1) *(p+2) *(p+3) *(p+4) *a *(a+1) *(a+2) *(a+3) *(a+4) 各元素地址 p p+1 p+2 p+3 p+4 a a+1 a+2 a+3 a+4 &a &a[1] &a[2] &a[3] &a[4] 2024年8月11日 尽管指针变量与数组名都保留着数组的存储地址,但它们却有着本质的区别。数组名是指针常量,它本身并不占用存储空间,一旦定义不允许更改;而指针变量的内容可以随时更改。 例如有定义: int a[10],*p; p=a; 则:p++合法;但a++不合法 4. 注意事项 2024年8月11日 5. 指针变量的有关运算 x=*p++: *与++是同级运算,等价于先计算*p,为x赋值a[0];p再自增1,新的p指向a[1]。 假设:int a[10],*p; p=a; p++;(或p+=1;) p将指向下一元素,即a[1]。 2024年8月11日 (*p)++; 表示p所指向的元素值加1(即a[0]++),而不是指针值p加1。 *(p++)与*(++p): *(p++)是先取*p的值,后使p加1; *(++p)是先使p加1,后取*p的值。 2024年8月11日 课堂练习1: main() { int a[3],*p=a; a[0]=10;a[1]=20;a[2]=30; printf(“%d ”,*p++); printf(“%d ”,*++p); } 答案: 10 30 2024年8月11日 main() { int a[]={1,2,3,4,5}; int *p=a+3; printf(“%d,%d,%d ”,*p,*(p+1),*p+3); } 结果: 4,5,7 课堂练习2: 2024年8月11日 【例8.5】将数组a中的n个整数按相反的顺序存放。 〖程序分析〗 将数组a中的n个整数逆序存放,即将数组a中的n个元素对换,a[0]与a[n-1]对换,a[1]与a[n-2]对换,……,直到将a[int(n-1)/2]与a[n-int((n-1)/2)-1]对换。我们可以定义两个指针变量p和q,分别指向数组的第一个元素和最后一个元素,交换*p和*q的值,然后p++,q--,重复该过程,直至执行 (N-1)/2+1次。 2024年8月11日 #define N 10 #include "stdio.h" void main() { int t,i,a[10]; int *p=a,*q=a+9,m; printf("Input 10 numbers: "); for(i=0;i<10;i++) scanf("%d",p+i); m=(N-1)/2; for(;p<=a+m;p++,q--) { t=*p; *p=*q; *q=t; } p=a; printf("The array has been reverted: "); for(i=0;i<10;i++) printf("%d ",*(p+i)); printf(" "); } 2024年8月11日 8.4.4 动态申请存储空间 在C语言的库函数中提供了一对标准函数malloc()和free(),用于在需要的时候申请或释放内存空间,它们的原型被声明在stdlib.h中。 内存申请库函数malloc() 调用格式如下: void *malloc(size) 作用:该函数在内存的动态存储区分配一个长度为size的连续存储空间。 返回值:若申请成功,则返回新分配内存块的起始地址,否则返回NULL。 2024年8月11日 内存释放库函数free() 调用格式如下: void free(ptr) 作用 :void free(ptr) 返回值:无 malloc()函数的返回值是一个void型指针,必须将其返回值强制转换成被赋值指针变量的数据类型。 例如: ptr=(int *)malloc(10*sizeof(int)); …… free(ptr); 2024年8月11日 【例8.6】编制程序利用动态内存分配存放n个整型数的一维数组,n的值在程序运行过程中指定,然后从键盘输入任意n个整数存入该数组中,并计算其各元素之和。 〖程序分析〗 该程序可以从键盘输入n的值,然后调用malloc()函数动态建立一个由n个整型数构成的一维数组,申请空间大小为n*sizeof(int)。对于这样得到的一维数组存储空间,既可以采用指针法引用每个元素,也可以采用下标法对每个元素进行操作。 2024年8月11日 #include "stdlib.h" #include "stdio.h" main() { int *p,i,n,s=0; printf("Enter the dimension of array:"); scanf("%d",&n); if((p=(int *)malloc(n*sizeof(int)))==NULL) { printf("Malloc memory failer!"); exit(0); } printf("Enter %d values of array: ",n); for(i=0;i<n;i++) { scanf("%d",p+i); s+=*(p+i); } printf("s=%d ",s); free(p); } $$

资源预览图

8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第1页
1
8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第2页
2
8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第3页
3
8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第4页
4
8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第5页
5
8.4用指针访问一维数组(课件)-《 C语言程序设计》同步教学(电子工业出版社)-第6页
6

由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。