C语言程序设计——指针(完整版)PPT演示课件PPT格式课件下载.ppt
- 文档编号:13884121
- 上传时间:2022-10-14
- 格式:PPT
- 页数:80
- 大小:672.50KB
C语言程序设计——指针(完整版)PPT演示课件PPT格式课件下载.ppt
《C语言程序设计——指针(完整版)PPT演示课件PPT格式课件下载.ppt》由会员分享,可在线阅读,更多相关《C语言程序设计——指针(完整版)PPT演示课件PPT格式课件下载.ppt(80页珍藏版)》请在冰豆网上搜索。
严格地说,一个指针是一个地址,是一个常量;
而一个指针变量却可以被赋予不同的指针值,是变量。
但通常把指针变量简称指针。
指针变量的值不仅可以是变量的地址,也可以是其他数据结构的地址。
例如:
在一个指针变量中可存放一个数组或一个函数的首地址。
9.2变量的指针和指向变量的指针变量,区别:
变量的指针和指针变量1.变量的指针就是变量的地址。
2.存放变量地址的变量是指针变量,它用来指向另一个变量。
为了表示指针变量和它所指向的变量之间的联系,在程序中用“*”符号表示“指向”。
若已定义i_pointer为指针变量,则*i_pointer是i_pointer所指向的变量,因此*i_pointer也代表一个变量,它和变量i是同一回事。
下面两个语句作用相同:
(1)i=3;
(2)*i_pointer=3;
第二个语句含义是将3赋给指针变量i_pointer所指向的变量i.,一、指针变量的定义,指针变量在使用前必须先定义,一般形式为:
类型说明符*指针变量名;
其中,*表示这是一个指针变量,类型说明符表示该指针变量所指变量的数据类型。
int*p1;
(其中p1(而不是*p1)是一个指向整型变量的指针变量,它的值是某个整型变量的地址。
)float*p2;
(其中p2是指向浮点型变量的指针变量),说明:
(1)指针变量名的构成原则是标识符,前面必须有“*”,表示该变量的类型是指针型变量。
(2)在一个定义语句中,可以同时定义普通变量、数组、指针变量。
(3)类型说明符说明的数据类型不是指针变量中存放的数据的数据类型,而是它将要指向的变量或数组的数据类型。
因此,一个指针变量只能用来指向同种数据类型的其他变量或数组,不能时而指向一个浮点型变量,时而指向一个整型变量。
二、指针变量的引用,指针变量中只能存放变量的地址,绝不能存放任何其他数据。
int*p;
p=2000;
/*2000是一个整数而不是一个地址*/,C语言提供两种有关的运算符:
(1)&
:
取地址运算符(用来表示变量的地址)
(2)*:
取内容运算符(用来取其指向的内容,或称“间接访问”运算符,或称指针运算符)两种运算符都是单目运算符,其结合性都为自右向左,优先级别相同。
&
a为变量a的地址,*p为指针变量p所指向的内存单元的内容(即p所指向的变量的值)。
说明:
(1)设有指向整型变量的指针变量p,若要把整型变量a的地址赋予p,有以下方式:
指针变量初始化的方法:
inta;
int*p=
(2)指针运算符*和指针变量说明中的指针说明符*不是一回事。
后者表示其后的变量是指针类型,前者则是一个运算符用以表示指针变量所指的变量。
(3)如果已执行了语句p=,则:
*p:
先进行*p的运算,即是变量a,再执行&
运算,即变量a的地址。
因此&
*p与&
a相同。
*&
a:
先进行&
a的运算,即得a的地址,再执行*运算,即&
a所指向的变量,即变量a。
因此*&
a与a相同。
#includevoidmain()inta,b;
int*p1,*p2;
a=100;
b=10;
p1=,例:
通过指针变量访问整型变量。
运行结果:
100,10100,10,#includevoidmain()inta=5,b,c,*p;
p=,例:
通过指针变量进行运算。
5,10,说明:
(1)指针变量的运算种类也是有限的,它只能进行赋值运算和部分算术运算及关系运算。
(2)指针变量还可以赋空值,其赋空值后,则可以使用,只是它不指向具体的变量而已。
#defineNULL0int*p=NULL;
三、指针变量作函数参数,#includeswap(intx,inty)intt;
t=x;
x=y;
y=t;
voidmain()inta=3,b=5;
if(ab)swap(a,b);
printf(“a=%d,b=%dn”,a,b);
C语言是通过传值将参数传递给函数的,对被调函数来说,没有直接的方法来改变主调函数内的变量的值。
例:
对两个整数按大小顺序输出。
a=3,b=5,#includeswap(int*x,int*y)intt;
t=*x;
*x=*y;
*y=t;
if(ab)swap(,使主调函数传递指向要被改变量的指针,即可使被调函数能改变主调函数的参数值。
a=5,b=3,数组与指针,(苏小红版第11章的11.1和11.2),一个数组是由连续的一块内存单元组成的,数组名即是这块连续内存单元的首地址。
一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址。
指针变量既然可以指向变量,当然也可以指向数组元素(把某一元素的地址放到一个指针变量中)。
所谓数组元素的指针就是数组元素的地址。
指向数组的指针变量称为数组指针变量。
其一般形式为:
其中,类型说明符表示所指数组的类型。
从中可以看出指向数组的指针变量和指向普通变量的指针变量的说明是相同的。
一、指向数组元素的指针,说明:
设有实型数组a,指向a的指针变量为pa,则有以下关系:
pa,a,&
a0均指向同一内存单元,它们是数组a的首地址,即是a0的首地址;
pa+1,a+1,&
a1均指向元素a1的地址;
pa+i,a+i,&
ai均指向元素ai的地址。
*(pa+i),*(a+i)是pa+i或a+i所指向的数组元素,即ai注意:
pa是变量,a与&
ai都是常量(地址)。
引入指针变量后,可以用两种方法来访问数组元素:
1.下标法:
采用ai形式访问数组元素:
2.指针法:
采用*(pa+i)或*(a+i)形式,用间接访问的方法来访问数组元素,即通过指向数组元素的指针找到所需的元素。
例:
(1)inta;
(2)inta;
初始化赋值int*p=,按C语言的规定:
如果指针p已指向数组中的一个元素,则p+1指向同一数组中的下一个元素,而不是将p的值(地址值)简单地加1。
数组元素是float型,每个元素占4个字节,则p+1意味着使p的值(地址值)加4个字节,以使它指向下一个元素,此时,p+1所代表的地址实际上是p+1d,d是一个数组元素所占的字节数。
二、通过指针引用数组元素,
(1)下标法#includevoidmain()inta10,i;
for(i=0;
i10;
i+)scanf(“%d”,例:
输出数组中的全部元素。
(设一个a数组,整型,有10个元素,要输出各元素的值有3种方法),
(2)通过数组名计算数组元素的地址,找出元素的值for(i=0;
i+)printf(“%d”,*(a+i);
(3)用指针变量指向数组元素for(p=a;
p(a+10);
p+)printf(“%d”,*p);
#includevoidmain()inta10,i,*p;
p=a;
i+)scanf(“%d”,p+);
printf(“n”);
i+,p+)printf(“%d”,*p);
(改错题)通过指针变量输出a数组中的10个元素。
123456789022153234003003625202116318529823728483,1.算术运算只能进行加减运算,数组指针变量加或减一个整数n的意义是把指针指向的当前位置(指某数组元素)向前或向后移动n个位置。
inta5,*pa;
pa=a;
/*pa指向a0,pa的值为/*pa指向a2,pa的值为&
a2*/,数组指针变量的运算:
2.两个指针变量之间的运算只有指向同一数组的两个指针变量之间才能进行运算,否则运算毫无意义。
(1)两指针变量相减两指针变量相减所得之差是两个指针所指数组元素之间相差的元素个数。
两指针变量不能进行加法运算。
(2)两指针变量进行关系运算指向同一数组的两个指针变量进行关系运算是表示它们所指数组元素之间的关系。
pa=qa表示pa和qa指向同一数组元素;
qapa表示qa处于高地址位置;
pa处于低地址位置;
#includevoidmain()inta5,i,*pa,*qa;
pa=qa=a;
i5;
i+)*qa=i;
qa+;
/*将指针qa指向a数组中的下一元素*/for(i=0;
paqa;
i+)printf(“a%d=%-2d”,i,*pa);
pa+;
通过指针变量的运算输出a数组中的5个元素。
a0=0a1=1a2=2a3=3a4=4,2.指针变量的自增自减运算如果先使p指向数组a的首元素(即p=a),请分析:
(1)p+:
使p指向数组a的下一元素,即a1。
(2)*p+:
由于元素符+和*同优先级,结合方向为自右向左,因此它等价于*(p+)。
(3)*(p+)与*(+p)作用不同。
(4)(*p)+:
表示p所指向的元素值加1,它等价于(a0)+。
若a0=3,则(*p)+的值为4。
注意:
是元素值加1,而不是指针值加1。
前面已介绍过可以用数组名作函数的参数,例如:
voidf(intarr,intn)voidmain()intarray10;
f(array,10);
f(intarr,intn)但在编译时是将arr按指针变量处理的,相当于将函数f的首部写成f(int*arr,intn)以上两种写法是等价的。
三、用数组名和数组指针变量作函数参数,以变量名和数组名、数组指针变量作为函数参数的比较:
归纳起来,如果有一个实参数组,想在函数中改变此数组中的元素的值,实参与形参的对应关系有以下种情况:
(1)形参和实参都用数组名,如:
voidmain()void(int,int)int;
(,);
(2)实参用数组名,形参用指针变量。
如:
void()void(int*,int)int;
(3)实参形参都用指针变量。
voidmain()void(int*,int)int,*p=a;
(p,);
(4)实参为指针变量,形参为数组名。
voidmain()void(intx,int),*p=a;
#includevoidmain()voidinv(int*x,intn);
inti,a10=3,7,9,11,0,6,7,5,4,2;
printf(“
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言程序设计 指针 完整版 PPT 演示 课件