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);
}
$$