C语言第11讲 指针ppt课件_第1页
C语言第11讲 指针ppt课件_第2页
C语言第11讲 指针ppt课件_第3页
C语言第11讲 指针ppt课件_第4页
C语言第11讲 指针ppt课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第五章5.1 指针的概念5.2 指针变量的定义和援用5.3 指针与数组5.4 指针与字符串5.5 指针数组与指向指针的指针5.6 前往指针值的函数5.7 本章要点小结5.8 本章程序举例5.1 5.1 指针的概念指针的概念一、数据的存取一、数据的存取1 1、内存地址、内存地址内存的每个字节都有一个编号,这内存的每个字节都有一个编号,这个编号称为个编号称为“内存地址。内存地址。 低地址低地址高地址高地址20002000200220022004200430003000程序中的每个数据都对应着内存中程序中的每个数据都对应着内存中的一个地址,从该地址开场的一个或多的一个地址,从该地址开场的一个或多个用

2、来存放该数据。个用来存放该数据。int i, j, k;int i, j, k;i ij jk k2 2、内存单元的地址和内存单元的内、内存单元的地址和内存单元的内容的区别:容的区别:假设假设i=3, j=5; i=3, j=5; 0000001100000011000000000000000000000101000001010000000000000000从图中可以看出它们的区别。从图中可以看出它们的区别。程序编译后曾经没有程序编译后曾经没有i、j、k这些变量名了,而是将变这些变量名了,而是将变量名转换为变量的地址,计算机经过内存地址对变量进展量名转换为变量的地址,计算机经过内存地址对变量进

3、展存取。存取。二、直接访问和间接访问二、直接访问和间接访问1 1、直接访问方式:、直接访问方式: 低地址低地址高地址高地址20002000200220022004200430003000i ij jk k0000001100000011000000000000000000000101000001010000000000000000、i=3;、j=i+2;、printf(%d, i);、scanf(%d, &i);、k=i+j; 如何执行?如何执行?00001000000010000000000000000000按变量的地址存取变量的方式按变量的地址存取变量的方式2 2、间接访问方式:、间接访问

4、方式:言语中可以定义整型变量、实型言语中可以定义整型变量、实型变量、字符型变量,各自存放相应类型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和运用一种特的数据;另外还可以定义和运用一种特殊类型的变量,用来存放变量的地址。殊类型的变量,用来存放变量的地址。 低地址低地址高地址高地址20002000200220022004200430003000i ij jk k000000110000001100000000000000000000010100000101000000000000000000001000000010000000000000000000假设曾经定义变量假设曾经定义变量

5、ip 用来存放整用来存放整型变量的地址,它被分配到内存单元型变量的地址,它被分配到内存单元3000和和3001。ip经过执行语句:经过执行语句:ip=&i; 将整型变量将整型变量i 的地址存放到变量的地址存放到变量ip中,即中,即ip的值为变的值为变量量i所对应的内存单元的起始地址所对应的内存单元的起始地址2000。2000=&i如今要存取如今要存取i的值可以这样做:先的值可以这样做:先找到存放找到存放i的地址的内存单元地址的地址的内存单元地址(3000和和3001),从中取出变量,从中取出变量i的地址的地址(2000),然后再对然后再对2000和和2001单元进展存取单元进展存取这就称为间接

6、访问。这就称为间接访问。3 3、关于、关于“指向的含义:指向的含义:变量变量ip的值为的值为2000,即变量,即变量i的地址,这样就在的地址,这样就在ip和和i之间之间建立了一种联络:建立了一种联络:经过变量经过变量ip知道变量知道变量i的地址,从而找到变量的地址,从而找到变量i的内存单元,的内存单元,因此说变量因此说变量ip指向变量指向变量i,用箭头表示这种,用箭头表示这种“指向关系。指向关系。20003000ip2000i4 4、为了表示将数值、为了表示将数值1010送到变量送到变量i i中,可以有两种表示方法:中,可以有两种表示方法:、将、将10送到变量送到变量i所标志的单元中;所标志的

7、单元中;2000i10、将、将10送到变量送到变量ip所指向的单元中;所指向的单元中;20003000ip2000i10三、指针与指针变量三、指针与指针变量经过地址能找到所需的变量单元,可以说:地址经过地址能找到所需的变量单元,可以说:地址“指向指向该变量单元。因此,把一个变量的地址称为该变量的该变量单元。因此,把一个变量的地址称为该变量的“指针。指针。 低地址低地址高地址高地址20002000200220022004200430003000i ij jk k00000011000000110000000000000000000001010000010100000000000000000000

8、1000000010000000000000000000ip2000假设一个变量专门用来存放另一假设一个变量专门用来存放另一个变量的地址,那么称它为个变量的地址,那么称它为“指针变指针变量。指针变量的值即指针变量中量。指针变量的值即指针变量中存放的值是指针地址。存放的值是指针地址。留意区分留意区分“指针和指针和“指针变量指针变量这两个概念。指针为这两个概念。指针为2000;而指;而指针变量为针变量为ip、数据所占有的内存单元个数是由其数据类型决议的;、数据所占有的内存单元个数是由其数据类型决议的;、首地址:即第一个单元的地址;、首地址:即第一个单元的地址;、表示地址的数与整数的区别;、表示地址

9、的数与整数的区别;、变量、变量i、j的地址能够相邻,也能够不相邻,是由系统分的地址能够相邻,也能够不相邻,是由系统分配的,我们不用关怀。配的,我们不用关怀。四、阐明四、阐明、程序中定义的每个变量在编译后都占有各自的内存单、程序中定义的每个变量在编译后都占有各自的内存单元,系统是经过内存地址对变量进展存取的;元,系统是经过内存地址对变量进展存取的;5.2 5.2 指针变量的定义和援用指针变量的定义和援用5.2.1 5.2.1 指针变量的定义与赋值指针变量的定义与赋值一、指针变量的定义一、指针变量的定义1、格式:、格式:其中:、其中:、“*表示定义的是指针变量;表示定义的是指针变量;、“类型名用来

10、指定该指针变量可以指向的变量的类型;类型名用来指定该指针变量可以指向的变量的类型;2、例:、例:int i, *ip;int *p1, *p2;float x, *xp; char *cp1, *cp2;3、阐明:、阐明:、“*只表示定义的变量为指针变量,但指针变量名中只表示定义的变量为指针变量,但指针变量名中并不包含并不包含“*;*是指针变量的标志,不可丢掉;是指针变量的标志,不可丢掉;、指针变量定义时,指定了它所指向的变量的数据类型;、指针变量定义时,指定了它所指向的变量的数据类型;int i,*ip=&i; int i,*ip; ip=&i;int i; char *xp; xp=&i;

11、指针变量定义时必需指定其所指向的变量的数据类型,指针变量定义时必需指定其所指向的变量的数据类型,而且运用过程中只能指向同一种类型的变量。而且运用过程中只能指向同一种类型的变量。、指针变量定义后,系统为变量分配一个存储单元,用来、指针变量定义后,系统为变量分配一个存储单元,用来存放地址;根据存储单元的长度分为大存储方式长指存放地址;根据存储单元的长度分为大存储方式长指针,针,4 Byte和小存储方式短指针,和小存储方式短指针,2 Byte;、指针变量定义后,假设不赋值,其值是不确定的。、指针变量定义后,假设不赋值,其值是不确定的。课本课本122-124二、指针变量的赋值二、指针变量的赋值1、赋值

12、语句:、赋值语句:int i, j, *p1, *p2;p1=&i; p2=&j;char ch, *cp1, *cp2;cp1=&ch; cp2=&ch;2、初始化:、初始化:int x=4;int i, *p1=&i;3、阐明:、阐明:、指针变量定义后,假设不赋值,其值是不确定的;、指针变量定义后,假设不赋值,其值是不确定的;、可以给指针变量赋空值、可以给指针变量赋空值(NULL),使指针变量不指向,使指针变量不指向任何变量;任何变量;#define NULL 0、指针变量的值为空值、指针变量的值为空值(NULL)与未对指针变量赋值,与未对指针变量赋值,意义不同;意义不同;、只能是同类型变

13、量的地址进展赋值;、只能是同类型变量的地址进展赋值;int i, *ip;char ch, *cp;ip=&i;cp=&ch;、可以将数组名或函数名赋给同些类型的指针变量;、可以将数组名或函数名赋给同些类型的指针变量;int a10, *ip; ip=a;、不能将一个整型量、不能将一个整型量(或任何其它非地址类型的数据或任何其它非地址类型的数据)赋给赋给一个指针变量;一个指针变量;int *ip;4、分析有关指针的程序时,画图是很好的方法:、分析有关指针的程序时,画图是很好的方法:假设有:假设有:int i, *p;p=&i;i=5;int i, *p;不定不定i不定不定pp=&i;&ii=5

14、;55.2.2 5.2.2 指针变量的援用指针变量的援用1 1、指针运算符、指针运算符( (间接访问符间接访问符) ):* *为了表示指针变量和它所指向的变量之间的联络,用为了表示指针变量和它所指向的变量之间的联络,用“*表示指向的关系。表示指向的关系。如:如:ip代表指针变量,代表指针变量,*ip表示表示ip所指向的变量值。即所指向的变量值。即*ip也代表一个变量值。也代表一个变量值。 例:例:、假设:、假设:ip=&i;i=5;*ip=5; 结论:结论:*ip与与i等价。等价。、x=i+1;x=*ip+1;2 2、取地址运算符:、取地址运算符:& &它与一个变量连用,以得到该变量的内存地址

15、。它与一个变量连用,以得到该变量的内存地址。int a, *p1, *p2;p1=&a;printf(%x, p1);p2=p1;*p1=3;printf(%d, *p1);int a, *p1, *p2;不定不定a不定不定p1不定不定p2p1=&a;&aprintf(%x, p1);p2=p1;&a*p1=3;3printf(%d, *p1);3 3、阐明:、阐明:、取地址运算符只能作用于变量:、取地址运算符只能作用于变量:&x, &a5;不能作用于常量、表达式或存放器变量:不能作用于常量、表达式或存放器变量:&25, &(i+1);、不能把整数赋值给一个指针变量:、不能把整数赋值给一个指针

16、变量:ip=3000;、不能把一个指针变量的值赋值给一个整型变量:、不能把一个指针变量的值赋值给一个整型变量:x=ip;、&既可作用于普通变量,也可作用于指针变量;既可作用于普通变量,也可作用于指针变量;、* *只能作用于指针变量;只能作用于指针变量;、表达式中的、表达式中的* *p p与变量定义中的与变量定义中的* *p p含义不同;含义不同;int i, *p=&i;*p=5;、int a, int a, * *p=&a;p=&a;int a, *p;p=&a;int a, *p;*p=&a;4、指针变量可以进展的操作:、指针变量可以进展的操作:int a, *p1, *p2;、赋值:、赋

17、值: p1=&a;p2=p1;、输出:、输出:printf(%x, p1);、取内容:、取内容:*p1=5;a=5;printf(%d, *p1);顺序反过来,不行输出的是地址值例例5.1#include void main( ) int a1=11, a2=22; int *p1, *p2; p1=&a1; p2=&a2; printf(%d, %dn, *p1, *p2); p2=p1; printf(%d, %dn, *p1, *p2);11a122a2不定不定p1不定不定p2&a1&a2*p1*p2&a1*p2*p2多个指针可以指向同一个存储单元。但在某一时辰,多个指针可以指向同一个存

18、储单元。但在某一时辰,一个指针变量只能指向一个存储单元,由于指针变量在某一个指针变量只能指向一个存储单元,由于指针变量在某一时辰只能存放一个变量的地址值。一时辰只能存放一个变量的地址值。例例5.2#include void main( ) int a1=11, a2=22; int *p1, *p2, *p; p1=&a1; p2=&a2; printf(%d, %dn, *p1, *p2); p=p1; p1=p2; p2=p; printf(%d, %dn, *p1, *p2);11a122a2不定不定p1不定不定p2不定不定p&a1&a2*p1*p2&a1&a2*p1*p1&a1*p2*

19、p2a1,a2的值没有交换,但的值没有交换,但p1,p2的指向交换的指向交换例例5.3#include void main( ) int a1=11, a2=22, t; int *p1, *p2; p1=&a1; p2=&a2; printf(%d, %dn, a1, a2); t=*p1; *p1=*p2; *p2=t; printf(%d, %dn, a1, a2);11a122a2不定不定t不定不定p1不定不定p2&a1*p1&a2*p2112211a1,a2的值交换,但的值交换,但p1,p2的指向没有交换的指向没有交换、将变量的地址赋给指针变量、将变量的地址赋给指针变量(p1=&a1

20、)、将一个指针变量赋给另一个指针变量、将一个指针变量赋给另一个指针变量(p2=p1)、经过指针变量间接访问它所指向的变量、经过指针变量间接访问它所指向的变量(*p1)5、*和和&运算符的进一步阐明:运算符的进一步阐明:、假设有:、假设有:p1=&a; 那么那么*p1等价于等价于a;&*p1&(*p1)&a、 *&a*(&a)*pa、(*p)+等价于:等价于:a+不同于:不同于:*p+*p+*(p+)5.2.1 5.2.1 指针作为函数参数指针作为函数参数#include void swap(int x, int y) int temp; temp=x; x=y; y=temp;void mai

21、n( ) int a, b; printf(nInput a, b: ); scanf(%d%d, &a, &b); if (ab) swap(a, b); printf(max=%d, min=%dn, a, b);留意:言语中的函数调用采用留意:言语中的函数调用采用“传值方式,即单向传传值方式,即单向传送方式。送方式。5.2 5.2 指针与函数指针与函数#include void swap(int *px, int *py) int temp; temp=*px; *px=*py; *py=temp;void main( ) int a, b, *p1, *p2; printf(nInpu

22、t a, b: ); scanf(%d%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); printf(max=%d, min=%dn, a, b);5a8b&ap1&bp2不定不定px不定不定py&a&b858a5b&ap1&bp2例例5.4 标题:输入两个整数标题:输入两个整数a、b,按大小顺序输出。,按大小顺序输出。#include void swap(int *px, int *py) int *temp; *temp=*px; *px=*py; *py=*temp;void main( ) int a, b, *p1, *p2; prin

23、tf(nInput a, b: ); scanf(%d%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); printf(max=%d, min=%dn, a, b);#include void swap(int *px, int *py) int *p; p=px; px=py; py=p;void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d, &a, &b); p1=&a; p2=&b; if (ab) swap(p1, p2); printf(max=%d, min

24、=%dn, a, b);5a8b&ap1&bp2不定不定px不定不定py&a&b&b&a5a8b&ap1&bp2、在主调函数中设、在主调函数中设n个变量;个变量;、将、将n变量的地址作为实参传给所调用的函数的形参;变量的地址作为实参传给所调用的函数的形参;、经过形参指针变量,改动该、经过形参指针变量,改动该n个变量的值;个变量的值;、主调函数就可以运用这些改动了的值;、主调函数就可以运用这些改动了的值;例例5.5 编写函数,求一维数组中的最大值和最小值。编写函数,求一维数组中的最大值和最小值。void search(int x , int n), int *pmax, int *pmin*pm

25、ax=*pmin=x0;for (i=1; in; i+)if (*pmaxxi) *pmin=xi;int a20, max, min;for (i=0; iy?x:y; return(&z);void main( ) int a, b, *p; scanf(%d%d, &a, &b); p=max(a, b); printf(Max=%d.n, *p);不定不定a不定不定b不定不定p不定不定x不定不定y1520&z1520不定不定z205.2.3 5.2.3 指向函数的指针指向函数的指针 函数由一组语句组成,存储在一段内存中,也有起始地址称为函数的入口地址,可以定义一个指针变量存储函数的入

26、口地址用来指向该函数。那么该变量称为指向函数的指针变量。P131-132类型标识符 *变量名方式参数列表int max(int x, int y) int z; z=xy?x:y; return(z);void main( ) int a, b, c,*p(); scanf(%d%d, &a, &b); p=max; c=(*p)(a,b) printf(Max=%d.n, c);设有如下定义:1、int max(int a,int b) max为函数名;2、int *fun(int a,int b) fun为指针函数;3、int (*pa)(); pa为函数指针;4、int *p,x;那么:

27、以下语句成立:1、x=max(5,8); 函数前往值为整型2、pa=max; 等号左右都有两个含义:地址和函数3、x=(*pa)(5,8);4、p=fun(5,8) 前往值为指针5.3 5.3 指针与数组指针与数组5.3.1 5.3.1 指向数组元素的指针变量指向数组元素的指针变量1、几个概念、几个概念、一个变量有地址,称变量的地址为该变量的指针;、一个变量有地址,称变量的地址为该变量的指针;、每个数组都有一个起始地址,数组的起始地址称为数组的指针;、每个数组都有一个起始地址,数组的起始地址称为数组的指针;、一个数组包含假设干元素,每个数组元素都在内存中占用一定的存、一个数组包含假设干元素,每

28、个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元素的地址称为数组元素的指针储单元,即都有相应的地址,数组元素的地址称为数组元素的指针;、指针变量可以指向变量,当然也可以指向数组和数组元素;、指针变量可以指向变量,当然也可以指向数组和数组元素;、数组元素的指针变量就是专门用来存放数组元素地址的变量。、数组元素的指针变量就是专门用来存放数组元素地址的变量。2、定义:、定义:int a10;int *p;int a10, *p;a0a1a2a3a4a5a6a7a8a9不定不定p3、赋值:、赋值:p=&a0;&a04、阐明:、阐明:、言语中的数组名代表数组首地址,即、言语中的数组名代表

29、数组首地址,即第第0号元素的地址;号元素的地址;、定义时可以进展初始化:、定义时可以进展初始化:int *p;p=&a0;int *p;*p=&a0;5.3.2 5.3.2 经过指针访问一维数组经过指针访问一维数组1、数组元素的援用:、数组元素的援用:int a10, *p;p=a;*p=5;a0=5;p=&a3;*p=5;a3=5;2、言语规定:无论数组的数据类型如何,假设指针变量、言语规定:无论数组的数据类型如何,假设指针变量p已指向数组中的某一元素,那么已指向数组中的某一元素,那么p+1指向同一数组中的指向同一数组中的下一个元素而不是将下一个元素而不是将p简单的加简单的加1例如:例如:、

30、int x10, *p=x;对于指向整型数组的指针变量对于指向整型数组的指针变量p,p+1意味着使意味着使p在原值的根底在原值的根底上加上加2个字节,以使它指向下一元素;个字节,以使它指向下一元素;、float x10, *p=x;对于指向对于指向float型数组的指针变量型数组的指针变量p,p+1意味着使意味着使p在原值的根在原值的根底上加底上加4个字节,以使它指向下一元素;个字节,以使它指向下一元素;3、在运用指针变量援用数组时,应留意以下问题:、在运用指针变量援用数组时,应留意以下问题:、给指针赋初值的方法:、给指针赋初值的方法:p=a; 或或p=&a0;、p+1或或a+1实践上表示数组

31、元素实践上表示数组元素a1的地址的地址(&a1);那么;那么p+i或或a+i表示数组的第表示数组的第i个元素的地址个元素的地址(&ai);、*(p+i)或或*(a+i)表示表示p+i或或a+i所指向的数组元素,即所指向的数组元素,即ai;、指向数组的指针变量也可以带下标;如:、指向数组的指针变量也可以带下标;如:pi与与*(p+i)等价;等价;、假设、假设p曾经指向某个数组元素曾经指向某个数组元素ai,那么,那么p+j表示指向数组元素表示指向数组元素ai+j;综上,可以用两种方法来援用一个数组元素:综上,可以用两种方法来援用一个数组元素:、下标法:用、下标法:用ai或或pi来援用数组来援用数组

32、a中的第中的第i号元素;号元素;、指针法:用、指针法:用*(p+i)或或*(a+i)来援用数组中的第来援用数组中的第i号元素;号元素;可见:任何由数组下标完成的操作都能由指针来实现;可见:任何由数组下标完成的操作都能由指针来实现;ai*(p+i)&aip+i4、在运用指针变量时,要留意以下几个问题:、在运用指针变量时,要留意以下几个问题:、可以运用、可以运用p+使指针变量使指针变量p的值不断改动:的值不断改动:for (p=a; p(a+10); p+) printf(%4d, *p);for (p=a; a(p+10); a+) printf(%4d, *a);、在程序运转期间,要一直留意指

33、针变量当前所指向的、在程序运转期间,要一直留意指针变量当前所指向的是哪一个元素是哪一个元素;可以执行可以执行p+等操作使等操作使p指向不同的数组元素,经过指向不同的数组元素,经过*p访问不同的数组元素。但要一直留意访问不同的数组元素。但要一直留意p当前所指向的是哪一个当前所指向的是哪一个数组元素!数组元素!编译系统都是将形参数组名作为指针变量来处置的。编译系统都是将形参数组名作为指针变量来处置的。f(int x , int n);f(int *x, int n);可以经过可以经过xi、*(x+i)来访问实参数组元素。来访问实参数组元素。要务虚参为指向数组首元素的指针:要务虚参为指向数组首元素的

34、指针: a 或或 pf(a, 10);f(p, 10);(p=a;)小结小结p为指向数组元素的指针为指向数组元素的指针言语规定:数组名表示数组的首地址,即第言语规定:数组名表示数组的首地址,即第0个元素个元素的地址;即数组名是指向数组第的地址;即数组名是指向数组第0个元素的指针常量。个元素的指针常量。表示数组第表示数组第 i 个元素的地址个元素的地址(&ai),即指向第,即指向第 i 个元素的指个元素的指针针表示数组的第表示数组的第 i 个元素个元素(ai)表示数组的第表示数组的第 i 个元素个元素(ai)数组第数组第 i 个元素地址的表示方法:个元素地址的表示方法:&ai, a+i, p+i

35、, &pi数组第数组第 i 个元素的表示方法:个元素的表示方法: ai, *(a+i), *(p+i), pi5.3.3 5.3.3 经过指针在函数间传送一维数组经过指针在函数间传送一维数组1、数组元素作为函数参数:、数组元素作为函数参数:void swap(int x, int y);swap(a1, a2);2、数组名作为函数参数:、数组名作为函数参数:void f(int x , int n);f(a, 10);数组名代表数组首地址。用数组名作实参,数组名代表数组首地址。用数组名作实参,调用函数时是把数组首地址传送给形参,而不调用函数时是把数组首地址传送给形参,而不是把数组的值传给形参。

36、是把数组的值传给形参。a0a1a2a3a4a5a6a7a8a9x0 x1x2x3x4x5x6x7x8x9实践上可以接受并存放地址值的只能是指针实践上可以接受并存放地址值的只能是指针变量,编译系统都是将形参数组名作为指针变变量,编译系统都是将形参数组名作为指针变量来处置的。量来处置的。假设在函数调用期间改动了数组某一存储单元的假设在函数调用期间改动了数组某一存储单元的内容,那么在函数调用终了后,已改动的值被保管下内容,那么在函数调用终了后,已改动的值被保管下来。来。变量名与数组名作函数参数时的比较:变量名与数组名作函数参数时的比较:变量名变量名变量的值变量的值不能不能数组名或指针变量数组名或指针

37、变量数组的起始地址数组的起始地址能能例题:有一个一维数组例题:有一个一维数组score,内放,内放10个学生成果,求平均成果。个学生成果,求平均成果。3、指针变量可替代数组名作为函数的参数:、指针变量可替代数组名作为函数的参数:、指针变量可以作为函数的形参;、指针变量可以作为函数的形参;、指针变量可以作为函数的实参;、指针变量可以作为函数的实参;归纳起来,实参与形参的对应关系有:归纳起来,实参与形参的对应关系有:、形参和实参都用数组名:、形参和实参都用数组名:f(int x , int n);f(a, 10);、实参用数组名,形参用指针变量:、实参用数组名,形参用指针变量:f(int *x,

38、int n);f(a, 10);、形参和实参都用指针变量:、形参和实参都用指针变量:f(int *x, int n);f(p, 10);、实参为指针变量,形参为数组名:、实参为指针变量,形参为数组名:f(int x , int n);f(p, 10);5.4 5.4 指针与字符串指针与字符串5.4.1 5.4.1 经过指针访问字符串经过指针访问字符串一、有关概念:一、有关概念:1、字符串的指针:、字符串的指针:对应的字符数组在内存中存放的首地址;对应的字符数组在内存中存放的首地址;2、指向字符串的指针变量:、指向字符串的指针变量:专门用来存放字符数组首地址的变量;专门用来存放字符数组首地址的变

39、量;3、字符数组指针变量的定义与赋值:、字符数组指针变量的定义与赋值:char *p, str30;p=str;p=&str0;二、字符串的表示方式:二、字符串的表示方式:1、用字符数组实现:、用字符数组实现:void main( ) static char s =I love China!; printf(%sn, s);2、用字符指针指向一个字符串:、用字符指针指向一个字符串:static char s =I love China!;char *p;p=s;printf(%sn, p);对于指向字符的指针变量,除了可以把字符数组名对于指向字符的指针变量,除了可以把字符数组名(指向字符的指针

40、常量指向字符的指针常量)赋给它外,还可以将一个字符串常赋给它外,还可以将一个字符串常量赋给它。量赋给它。也可以在定义时赋初值:也可以在定义时赋初值:言语在处置字符串常量时,在内存中开辟延续的存储言语在处置字符串常量时,在内存中开辟延续的存储单元,存放字符串中的各字符和字符串终了标志单元,存放字符串中的各字符和字符串终了标志0。对指针变量赋值的作用是:将字符串在内存中的首地址对指针变量赋值的作用是:将字符串在内存中的首地址赋给指针变量。赋给指针变量。不同于用字符串常量对字符数组赋初值:不同于用字符串常量对字符数组赋初值:其作用是:将字符串中的各字符和终了标志其作用是:将字符串中的各字符和终了标志

41、0存放到数组存放到数组ca的各元素中,数组的首地址用数组名的各元素中,数组的首地址用数组名ca表示。表示。例例5.8:将字符数组:将字符数组a中的字符串复制到字符数组中的字符串复制到字符数组b中。中。、下标法:、下标法:、指针法:、指针法:三、字符数组与字符指针变量的比较:三、字符数组与字符指针变量的比较:、字符数组由假设干个元素组成,每个元素中存放着一个字、字符数组由假设干个元素组成,每个元素中存放着一个字符;而字符指针变量中存放的是地址,不是将字符串放到符;而字符指针变量中存放的是地址,不是将字符串放到字符指针变量中;字符指针变量中;、赋值方式:、赋值方式:、对字符指针变量赋初值:、对字符

42、指针变量赋初值:、字符指针变量是可以改动的。、字符指针变量是可以改动的。以下写法是正确的:1、char *s=“how are you?;2、char *s; s=“how are you?;3、char str20,*s; s=str; s=“how are you?;4、char str20=“how are you?;5、char *s,str20; s=str; scanf(“%s,s);以下写法是错误的:1、char str20; str=“how are you?;2、char *s; scanf(“%s,s);注:数组名是首地址是常量值,不能对其赋值;指针变量是变量可以对其赋值,

43、但在scanf语句中必需确定指向后赋值。5.4.2 5.4.2 经过指针在函数间传送字符串经过指针在函数间传送字符串将一个字符串从一个函数传送到另一个函数,可以用将一个字符串从一个函数传送到另一个函数,可以用地址传送的方法,即用字符数组名、指向字符串的指针变地址传送的方法,即用字符数组名、指向字符串的指针变量或其它字符地址表达式作参数。量或其它字符地址表达式作参数。1、用字符数组作实参、用字符数组作实参2、用字符指针变量作实参、用字符指针变量作实参3、可以对、可以对copy_string函数作以下简化:函数作以下简化:、while (*to=*from)、while (*to+=*from+)

44、、while (*from)、4、对、对copy_string函数的调用方式:函数的调用方式:5.5 5.5 指针与多维数组指针与多维数组、数组是具有一样数据类型数据的集合。数组的每个元素又可以是、数组是具有一样数据类型数据的集合。数组的每个元素又可以是一个数组。一个数组。、根据语法规定:假设、根据语法规定:假设 x 指向某一维数组,那么指向某一维数组,那么xi与与*(x+i)等等价,价,&xi与与x+i等价。等价。5.5.1 5.5.1 经过指针访问多维数组经过指针访问多维数组一、多维数组的地址:一、多维数组的地址:1、多维数组的性质、多维数组的性质a00a01a02a03a10a11a12

45、a13a20a21a22a23可以以为可以以为a是具有是具有3个元素个元素的一维数组:的一维数组:a0、a1、a2;a0a1a2每个元素又是具有每个元素又是具有4个整型个整型元素的一维数组。元素的一维数组。2、数组名、数组名a表示地址表示地址2000120023200452006720089201011201213201415201617201819202021202223a0a1a2从二维数组的角度来看,从二维数组的角度来看,a为二维数组名,表示整个二维为二维数组名,表示整个二维数组的首地址。数组的首地址。假设把假设把a看成一维数组,每看成一维数组,每个数组元素个数组元素a0、a1、a2占占

46、_个字节。个字节。a表示表示a0的地址的地址(&a0: 2000);a+1表示的地址表示的地址(); a+1&a1a+2表示的地址表示的地址(); a+2&a2a+1表示:表示:a+81=2021a+2表示:表示:a+82=2021a+i表示:表示:a+8ia+i表示表示ai的地址的地址&ai,即第,即第i行的地址,它是指向一行的地址,它是指向一维数组的指针。维数组的指针。3、ai表示地址表示地址a001a013a025a037a109a1111a1213a1315a2017a2119a2221a2323a0a1a2a0、a1、a2是是一维数组名。一维数组名。a0是一维数组是一维数组a0的首地

47、址,即第的首地址,即第0行一维数组中第行一维数组中第0列元素的地址列元素的地址(&a00);即;即a0的值为的值为&a00;a1是一维数组是一维数组a1的首地址,即第的首地址,即第1行一维数组中第行一维数组中第0列元素的地址列元素的地址(&a10);即;即a1的值为的值为&a10;a2是一维数组是一维数组a2的首地址,即第的首地址,即第2行一维数组中第行一维数组中第0列元素的地址列元素的地址(&a20);即;即a2的值为的值为&a20;因此,因此,ai是第是第i行首元素的地址行首元素的地址(指针指针),它是指向数组,它是指向数组元素的指针。元素的指针。4、ai+j表示地址:表示地址:a0+1表

48、示第表示第0行第行第1列元素的地址;列元素的地址;&a01a0+2表示第表示第0行第行第2列元素的地址;列元素的地址;&a02a2+3表示第表示第2行第行第3列元素的地址;列元素的地址;&a235、*(a+i)表示地址:表示地址:*(a+i)等价于等价于ai6、*(a+i)+j表示地址:表示地址:*(a+i)+j等价于等价于ai+j7、数组元素、数组元素aij的表示:的表示:ai+j*(a+i)+j*(a+i) j假设假设i=0,a0j可表示为:可表示为:假设假设j=0,ai0可表示为:可表示为:8、(a+i)与与*(a+i)的比较:的比较:(a+i)等价于等价于&ai*(a+i)等价于等价于

49、ai、都表示地址:、都表示地址:a+i表示第表示第i行的地址行的地址(行指针行指针),*(a+i)表示第表示第i行首元素的地址行首元素的地址、它们指向的数据类型不同:、它们指向的数据类型不同:a+i指向一个一维数组指向一个一维数组(二维数组的一行、行指针二维数组的一行、行指针);*(a+i)指向数组元素;指向数组元素;假设进展操作:假设进展操作:(a+i)+1:使指针挪动一维数组所占字节总数:使指针挪动一维数组所占字节总数(一行、一行、8字节字节)*(a+i)+1:使指针挪动一个数组元素所占内存字节总数:使指针挪动一个数组元素所占内存字节总数(2字节字节)9、对、对ai性质的进一步阐明:性质的

50、进一步阐明:ai从方式上看是从方式上看是a数组中第数组中第i个元素。个元素。假设假设a是一维数组名,那么是一维数组名,那么ai代表代表a数组第数组第i个元素所占的内存个元素所占的内存单元。单元。ai是有物理地址的,占内存单元。是有物理地址的,占内存单元。假设假设a是二维数组,那么是二维数组,那么ai代表一维数组名。代表一维数组名。ai本身并不占实本身并不占实践的内存单元,它也不存放践的内存单元,它也不存放a数组中各个元素的值;它只是一个地址。数组中各个元素的值;它只是一个地址。a、a+i、ai、*(a+i)、*(a+i)+j、ai+j都是地址,都是地址,*(ai+j)、*(*(a+i)+j)是

51、二维数组元素是二维数组元素aij的值。的值。10、关于、关于&ai的阐明:的阐明:、不要把、不要把&ai简单的了解为简单的了解为ai单元的物理地址,由于并不存在单元的物理地址,由于并不存在ai这个变量。它只是一种地址的计算方法,能得到第这个变量。它只是一种地址的计算方法,能得到第i行的首地址;行的首地址;、&ai和和ai的值是一样的,但它们的含义不同:的值是一样的,但它们的含义不同:&ai或或a+i指向行,而指向行,而ai或或*(a+i)指向列。指向列。当列下标当列下标j为为0时,时,&ai和和ai(即即ai+j)值相等,即指向同一位置。值相等,即指向同一位置。、*(a+i)只是只是ai的另一

52、种表示方式,不要简单的以为是的另一种表示方式,不要简单的以为是“a+i所指所指单元的内容。单元的内容。对于二维数组:对于二维数组:a+i=ai=*(a+i)=&ai=&ai0,它们的地址相等。,它们的地址相等。例:输出二维数组有关的值。例:输出二维数组有关的值。二、指向多维数组的指针变量二、指向多维数组的指针变量1、指向数组元素的指针变量、指向数组元素的指针变量与指向一维数组元素的指针变量一样,它用来专门存与指向一维数组元素的指针变量一样,它用来专门存放某个数组元素的内存地址。或者说,用于指向某个数组放某个数组元素的内存地址。或者说,用于指向某个数组元素,定义方法与指向某种类型变量的指针变量一

53、样。元素,定义方法与指向某种类型变量的指针变量一样。2、指向一维数组的指针变量、指向一维数组的指针变量定义:类型名定义:类型名(*指针变量名指针变量名)n如:如: int (*p)4int a34;、*p有有4个元素,每个元素为整型;即个元素,每个元素为整型;即p所指的对象是有所指的对象是有4个整型元素的数组。个整型元素的数组。p为行指针为行指针(a+i)。、p只能指向一个包含只能指向一个包含4个元素的一维数组,个元素的一维数组,p的值就是的值就是该一维数组的首地址。该一维数组的首地址。p不能指向一维数组中的元素;不能指向一维数组中的元素;、p+i表示二维数组中第表示二维数组中第i行的地址;行

54、的地址;*(p+i)+j表示第表示第i行第行第j列元素的地址;列元素的地址;*(*(p+i)+j)即数组元素即数组元素aij。例:输出二维数组中任一行任一列元素的值。例:输出二维数组中任一行任一列元素的值。scanf(%d%d, &i, &j);printf(a%d%d=%dn, i, j, *(*(p+i)+j) );5.5.2 5.5.2 经过指针在函数间传送多维数组经过指针在函数间传送多维数组用数组名作实参,那么是将二维数组首行的指针常量用数组名作实参,那么是将二维数组首行的指针常量(二二维数组名维数组名)传送给了作为函数形参的指针变量,该指针变量就传送给了作为函数形参的指针变量,该指针

55、变量就指向了二维数组的第指向了二维数组的第0行。行。例:求例:求3行行4列二维数组中的最大元素。列二维数组中的最大元素。方法一、方法一、int max_value(int (*pa)4, int n) int m=pa00; for (i=0; in; i+) for (j=0; j4; j+) if (mpaij) m=paij; return(m);(*(pa+i)+j)(*(pa+i)jint max_value(int pb 4, int n)int max_value(int 4, int )int max_value(int (*)4, int )方法二、方法二、int max_value(int *p, int n) int m=*p; for (i=0; im) m=*p;return(m);比较:比较:int (*pa)4 int *pb41、int (*pa)4 pa为数组指针,行指针为数组指针,行指针,是指是指针变量,表示二维数组每一行的地址。数针变量,表示二维数组每一行的地址。数组元素的值为数据。组元素的值为数据。如:如:int (*pa)4,a34; pa=a;那么:那么:pa00=a0

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论