[IT认证]C语言第11讲 指针.ppt_第1页
[IT认证]C语言第11讲 指针.ppt_第2页
[IT认证]C语言第11讲 指针.ppt_第3页
[IT认证]C语言第11讲 指针.ppt_第4页
[IT认证]C语言第11讲 指针.ppt_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

第五章,指针,5.1 指针的概念 5.2 指针变量的定义和引用 5.3 指针与数组 5.4 指针与字符串 5.5 指针数组与指向指针的指针 5.6 返回指针值的函数 5.7 本章要点小结 5.8 本章程序举例,5.1 指针的概念,一、数据的存取,1、内存地址,内存的每个字节都有一个编号,这个编号称为“内存地址”。,程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个用来存放该数据。,int i, j, k;,i,j,k,2、内存单元的地址和内存单元的内容的区别:,若i=3, j=5;,从图中可以看出它们的区别。,程序编译后已经没有i、j、k这些变量名了,而是将变量名转换为变量的地址,计算机通过内存地址对变量进行存取。,二、直接访问和间接访问,1、直接访问方式:,、i=3;,、j=i+2;,、printf(“%d“, i);,、scanf(“%d“, ,、k=i+j; 如何执行?,按变量的地址存取变量的方式,2、间接访问方式:,语言中可以定义整型变量、实型变量、字符型变量,各自存放相应类型的数据;另外还可以定义和使用一种特殊类型的变量,用来存放变量的地址。,假设已经定义变量 ip 用来存放整型变量的地址,它被分配到内存单元3000和3001。,ip,通过执行语句:ip= 将整型变量i 的地址存放到变量ip中,即ip的值为变量i所对应的内存单元的起始地址2000。,2000=&i,现在要存取i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取这就称为间接访问。,3、关于“指向”的含义:,变量ip的值为2000,即变量i的地址,这样就在ip和i之间建立了一种联系:,通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。,4、为了表示将数值10送到变量i中,可以有两种表示方法:,、将10送到变量i所标志的单元中;,10,、将10送到变量ip所指向的单元中;,10,三、指针与指针变量,通过地址能找到所需的变量单元,可以说:地址“指向”该变量单元。因此,把一个变量的地址称为该变量的“指针”。,如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。,注意区分“指针”和“指针变量”这两个概念。指针为2000;而指针变量为ip,、数据所占有的内存单元个数是由其数据类型决定的;,、首地址:即第一个单元的地址;,、表示地址的数与整数的区别;,、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。,四、说明,、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对变量进行存取的;,5.2 指针变量的定义和引用,5.2.1 指针变量的定义与赋值,一、指针变量的定义,1、格式:,类型名 *指针变量名,其中:、“*”表示定义的是指针变量; 、“类型名”用来指定该指针变量可以指向的变量的类型;,2、例:,int i, *ip;,int *p1, *p2;,float x, *xp;,char *cp1, *cp2;,3、说明:,、“*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;“*“是指针变量的标志,不可丢掉;,、指针变量定义时,指定了它所指向的变量的数据类型;,int i,*ip=,指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。,、指针变量定义后,系统为变量分配一个存储单元,用来存放地址;根据存储单元的长度分为大存储模式(长指针,4 Byte)和小存储模式(短指针,2 Byte);,、指针变量定义后,若不赋值,其值是不确定的。,课本122-124,二、指针变量的赋值,1、赋值语句:,int i, j, *p1, *p2;,p1=,char ch, *cp1, *cp2;,cp1=,2、初始化:,int x=4;,int x; x=4;,int i, *p1=,int i, *p1; p1=,3、说明:,、指针变量定义后,若不赋值,其值是不确定的;,、可以给指针变量赋空值(NULL),使指针变量不指向任何变量;,ip=NULL;,#define NULL 0,、指针变量的值为空值(NULL)与未对指针变量赋值,意义不同;,、只能是同类型变量的地址进行赋值;,int i, *ip; char ch, *cp;,ip=,ip=,、可以将数组名或函数名赋给同些类型的指针变量;,int a10, *ip;,ip=,ip=a;,、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;,int *ip;,ip=3000;,4、分析有关指针的程序时,画图是很好的方法:,若有:int i, *p;,p=,i=5;,int i, *p;,p=,&i,i=5;,5,5.2.2 指针变量的引用,1、指针运算符(间接访问符):*,为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。,如:ip代表指针变量,*ip表示ip所指向的变量值。即*ip也代表一个变量值。,例:,、若:ip=&i;,i=5;,*ip=5;,结论:*ip与i等价。,、x=i+1;,x=*ip+1;,2、取地址运算符:&,它与一个变量连用,以得到该变量的内存地址。,int a, *p1, *p2; p1=,int a, *p1, *p2;,p1=,&a,printf(“%x“, p1);,p2=p1;,&a,*p1=3;,3,printf(“%d“, *p1);,3、说明:,、取地址运算符只能作用于变量:,不能作用于常量、表达式或寄存器变量:,、不能把整数赋值给一个指针变量:ip=3000;,、不能把一个指针变量的值赋值给一个整型变量:x=ip;,、&既可作用于一般变量,也可作用于指针变量;,、*只能作用于指针变量;,、表达式中的*p与变量定义中的*p含义不同;,int i, *p=,、int a, *p=,int a, *p; p=,int a, *p; *p=,4、指针变量可以进行的操作:,int a, *p1, *p2;,、赋值:,p1=,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,&a2,*p1,*p2,&a1,*p2,*p2,多个指针可以指向同一个存储单元。但在某一时刻,一个指针变量只能指向一个存储单元,因为指针变量在某一时刻只能存放一个变量的地址值。,例5.2,#include void main( ) int a1=11, a2=22; int *p1, *p2, *p; p1= ,&a1,&a2,*p1,*p2,&a1,&a2,*p1,*p1,&a1,*p2,*p2,使两个指针交换指向,a1,a2的值没有交换,但p1,p2的指向交换,例5.3,#include void main( ) int a1=11, a2=22, t; int *p1, *p2; p1= ,&a1,*p1,&a2,*p2,11,22,11,交换两个指针变量所指向变量的值,a1,a2的值交换,但p1,p2的指向没有交换,反映了指针变量的引用方法:,、将变量的地址赋给指针变量(p1=&a1),、将一个指针变量赋给另一个指针变量(p2=p1),、通过指针变量间接访问它所指向的变量(*p1),5、*和&运算符的进一步说明:,、若有:p1= 则*p1等价于a;,&*p1,&(*p1),&a,、 *&a,*(&a),*p,a,、(*p)+,等价于:a+,不同于:*p+,*p+,*(p+),5.2.1 指针作为函数参数,#include void swap(int x, int y) int temp; temp=x; x=y; y=temp; void main( ) int a, b; printf(“nInput a, b: “); scanf(“%d%d“, ,注意:语言中的函数调用采用“传值”方式,即单向传递方式。,即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。,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(“nInput a, b: “); scanf(“%d%d“, ,&a,&b,8,5,例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; printf(“nInput a, b: “); scanf(“%d%d“, ,*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因此,对*temp赋值可能会破坏系统的正常工作状况。,应该将*px的值赋给一个整型变量,用整型变量作为临时存储空间实现*px和*py的交换。,#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,&b,&a,如果想通过函数调用得到几个要改变的值,可以:,、在主调函数中设n个变量;,、将n变量的地址作为实参传给所调用的函数的形参;,、通过形参指针变量,改变该n个变量的值;,、主调函数就可以使用这些改变了的值;,例5.5 编写函数,求一维数组中的最大值和最小值。,void search(int x , int n ) , int *pmax, int *pmin,*pmax=*pmin=x0;,for (i=1; in; i+),if (*pmaxxi) *pmax=xi;,if (*pminxi) *pmin=xi;,int a20, max, min; for (i=0; i20; i+) scanf(“%d“,search(a, 20, ,5.2.2 指针函数,函数返回值为指针的函数成为指针函数。P129,类型标识符 *函数名(形式参数列表),int *fun(int a,int b) 函数体语句 return &变量名 或 return 指针变量 ,int *max(int x, int y) int z; z=xy?x:y; return( ,15,20,&z,15,20,20,5.2.3 指向函数的指针,函数由一组语句组成,存储在一段内存中,也有起始地址称为函数的入口地址,可以定义一个指针变量存储函数的入口地址用来指向该函数。则该变量称为指向函数的指针变量。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“, ,设有如下定义: 1、int max(int a,int b) max为函数名; 2、int *fun(int a,int b) fun为指针函数; 3、int (*pa)(); pa为函数指针; 4、int *p,x; 则:下列语句成立: 1、x=max(5,8); 函数返回值为整型 2、pa=max; 等号左右都有两个含义:地址和函数 3、x=(*pa)(5,8); 4、p=fun(5,8) 返回值为指针,5.3 指针与数组,5.3.1 指向数组元素的指针变量,1、几个概念,、一个变量有地址,称变量的地址为该变量的指针;,、每个数组都有一个起始地址,数组的起始地址称为数组的指针;,、一个数组包含若干元素,每个数组元素都在内存中占用一定的存储单元,即都有相应的地址,数组元素的地址称为数组元素的指针;,、指针变量可以指向变量,当然也可以指向数组和数组元素;,、数组元素的指针变量就是专门用来存放数组元素地址的变量。,2、定义:,类型名 *指针变量名,int a10; int *p;,int a10, *p;,3、赋值:,p=,&a0,4、说明:,、语言中的数组名代表数组首地址,即第0号元素的地址;,p=,p=a;,、定义时可以进行初始化:,int *p=,int *p; p=,int *p; *p=,int *p=a;,5.3.2 通过指针访问一维数组,1、数组元素的引用:,int a10, *p;,p=a;,*p=5;,a0=5;,p=,*p=5;,a3=5;,2、语言规定:无论数组的数据类型如何,若指针变量p已指向数组中的某一元素,则p+1指向同一数组中的下一个元素(而不是将p简单的加1),例如:,、int x10, *p=x;,对于指向整型数组的指针变量p,p+1意味着使p在原值的基础上加2个字节,以使它指向下一元素;,、float x10, *p=x;,对于指向float型数组的指针变量p,p+1意味着使p在原值的基础上加4个字节,以使它指向下一元素;,总之:设d是一个数组元素所占的字节数,则p+i表示指针移动了i个元素,而它实际的地址变化为:p+i*d。,3、在使用指针变量引用数组时,应注意以下问题:,、给指针赋初值的方法:,p=a; 或 p=,、p+1或a+1实际上表示数组元素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来引用数组a中的第i号元素;,、指针法:用*(p+i)或*(a+i)来引用数组中的第i号元素;,可见:任何由数组下标完成的操作都能由指针来实现;,ai,*(p+i),&ai,p+i,4、在使用指针变量时,要注意以下几个问题:,、可以使用p+使指针变量p的值不断改变:,for (p=a; p(a+10); p+) printf(“%4d“, *p);,for (p=a; a(p+10); a+) printf(“%4d“, *a);,、在程序运行期间,要始终注意指针变量当前所指向的是哪一个元素;,可以执行p+等操作使p指向不同的数组元素,通过*p访问不同的数组元素。但要始终注意p当前所指向的是哪一个数组元素!,通过指针在函数间传递一维数组:,编译系统都是将形参数组名作为指针变量来处理的。,f(int x , int n);,f(int *x, int n);,可以通过xi、*(x+i)来访问实参数组元素。,要求实参为指向数组首元素的指针:,a 或 p,f(a, 10);,f(p, 10);,(p=a;),小结,int a10, *p; p=a; 或 p=,p为指向数组元素的指针,语言规定:数组名表示数组的首地址,即第0个元素的地址;即数组名是指向数组第0个元素的指针常量。,a+i,p+i,表示数组第 i 个元素的地址(&ai),即指向第 i 个元素的指针,*(a+i),*(p+i),表示数组的第 i 个元素(ai),ai,pi,表示数组的第 i 个元素(ai),数组第 i 个元素地址的表示方法:,&ai, a+i, p+i, &pi,数组第 i 个元素的表示方法:,ai, *(a+i), *(p+i), pi,5.3.3 通过指针在函数间传递一维数组,1、数组元素作为函数参数:,void swap(int x, int y);,swap(a1, a2);,2、数组名作为函数参数:,void f(int x , int n);,f(a, 10);,数组名代表数组首地址。用数组名作实参,调用函数时是把数组首地址传递给形参,而不是把数组的值传给形参。,x,x0,x1,x2,x3,x4,x5,x6,x7,x8,x9,实际上能够接受并存放地址值的只能是指针变量,编译系统都是将形参数组名作为指针变量来处理的。,void f(int *x, int n);,若在函数调用期间改变了数组某一存储单元的内容,则在函数调用完毕后,已改变的值被保留下来。,变量名与数组名作函数参数时的比较:,变量名,变量的值,不能,数组名或指针变量,数组的起始地址,能,需要说明的是: 语言的函数调用都是采用“值传递”方式;当用变量名作函数参数时传递的是变量的值;用数组名作函数参数时,由于数组名代表的是数组首地址,因此传递的是数组首地址,所以要求形参为指针变量。,例题:有一个一维数组score,内放10个学生成绩,求平均成绩。,3、指针变量可替代数组名作为函数的参数:,、指针变量可以作为函数的形参;,、指针变量可以作为函数的实参;,归纳起来,实参与形参的对应关系有:,、形参和实参都用数组名:,f(int x , int n);,f(a, 10);,把实参数组首地址传给形参作为形参数组首地址;,、实参用数组名,形参用指针变量:,f(int *x, int n);,f(a, 10);,把实参数组首地址传给形参(指针变量),函数中用指针访问实参数组,、形参和实参都用指针变量:,f(int *x, int n);,f(p, 10);,函数调用前应先给实参指针变量赋值(如:p=a),、实参为指针变量,形参为数组名:,f(int x , int n);,f(p, 10);,实参通过指针变量为形参提供数组首地址;,5.4 指针与字符串,存放字符串的字符数组是一种特殊的数组,即以0作为结束标志。在访问字符串时候,以0作为结束条件。,5.4.1 通过指针访问字符串,一、有关概念:,1、字符串的指针:,对应的字符数组在内存中存放的首地址;,2、指向字符串的指针变量:,专门用来存放字符数组首地址的变量;,3、字符数组指针变量的定义与赋值:,char *p, str30;,p=str;,p=,二、字符串的表示形式:,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);,对于指向字符的指针变量,除了可以把字符数组名(指向字符的指针常量)赋给它外,还可以将一个字符串常量赋给它。,char *cp; cp=“Hello, world!“;,也可以在定义时赋初值:,char *cp= “Hello, world!“;,语言在处理字符串常量时,在内存中开辟连续的存储单元,存放字符串中的各字符和字符串结束标志0。,对指针变量赋值的作用是:将字符串在内存中的首地址赋给指针变量。,#include void main( ) char a =“Hello, World!“, b20; char *pa=a, *pb=b; for ( ; *pa!=0; pa+, pb+) *pb=*pa; *pb=0; printf(“%sn“, b); ,不同于用字符串常量对字符数组赋初值:,char ca =“Hello, world!“;,其作用是:将字符串中的各字符和结束标志0存放到数组ca的各元素中,数组的首地址用数组名ca表示。,例5.8:将字符数组a中的字符串复制到字符数组b中。,、下标法:,#include void main( ) char a =“Hello, World!“, b20; int i; for (i=0; ai!=0; i+) bi=ai; bi=0; printf(“%sn“, b); ,、指针法:,三、字符数组与字符指针变量的比较:,、字符数组由若干个元素组成,每个元素中存放着一个字符;而字符指针变量中存放的是地址,不是将字符串放到字符指针变量中;,、赋值方式:,char str20; str20=“I love China!“;,char *ps; ps=“I love China!“;,、对字符指针变量赋初值:,char *s=“I love China!“;,char *s; s=“I love China!“;,char str =“I love China!“;,char str14; strcpy(str, “I love China!“);,、字符指针变量是可以改变的。,char s20, *ps;,以下写法是正确的: 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); 注:数组名是首地址是常量值,不能对其赋值;指针变量是变量可以对其赋值,但在scanf语句中必须确定指向后赋值。,5.4.2 通过指针在函数间传递字符串,将一个字符串从一个函数传递到另一个函数,可以用地址传递的方法,即用字符数组名、指向字符串的指针变量或其它字符地址表达式作参数。,1、用字符数组作实参,main( ) char a=“abcdefg“; char b=“12345“; copy_string(a, b); ,void copy_string(char to, char from) int i=0; while (fromi!=0) toi=fromi; i+; toi=0; ,2、用字符指针变量作实参,char *a=“abcdefg“; char *b=“12345“; copy_string(a, b);,void copy_string(char *to, char *from) for ( ; *from!=0; from+, to+) *to=*from; *to=0; ,3、可以对copy_string函数作下列简化:,、,void copy_string(char *to, char *from) while ( (*to=*from)!=0 ) to+; from+; ,while (*to=*from),、,void copy_string(char *to, char *from) while ( (*to+=*from+)!=0 ) ,;,while (*to+=*from+),、,void copy_string(char *to, char *from) while (*from!=0 ) *to+=*from+; ,*to=0;,while (*from),、,void copy_string(char *to, char *from) for ( ; (*to+=*from+)!=0; ) ; ,、,void copy_string(char *to, char *from) for ( ; (*to+=*from+) ; ) ; ,4、对copy_string函数的调用形式:,char s120=“12345“, s2 =“How are you!“;,copy_string(s1, s2);,s1: “How are you!“,copy_string(s1, s2+2);,s1: “w are you!“,copy_string(s1+2, s2);,s1: “12How are you!“,5.5 指针与多维数组,、数组是具有相同数据类型数据的集合。数组的每个元素又可以是一个数组。,、根据语法规定:如果 x 指向某一维数组,则xi与*(x+i)等价,&xi与x+i等价。,5.5.1 通过指针访问多维数组,一、多维数组的地址:,1、多维数组的性质,static int a34=1,3,5,7, 9,11,13,15, 17,19,21,23;,可以认为a是具有3个元素的一维数组:a0、a1、a2;,a0,a1,a2,每个元素又是具有4个整型元素的一维数组。,2、数组名a表示地址,a0,a1,a2,从二维数组的角度来看,a为二维数组名,表示整个二维数组的首地址。,若把a看成一维数组,每个数组元素a0、a1、a2占_个字节。,8,a表示a0的地址(&a0: 2000);,a+1表示 的地址( );,a+1,&a1,a1,&a1:,2008,a+2表示 的地址( );,a+2,&a2,a2,&a2:,2016,a+1表示:a+81=2008,a+2表示:a+82=2016,a+i表示:a+8i,a+i表示ai的地址&ai,即第i行的地址,它是指向一维数组的指针。,3、ai表示地址,a0,a1,a2,a0、a1、a2是一维数组名。,a0是一维数组a0的首地址,即第0行一维数组中第0列元素的地址(&a00);即a0的值为&a00;,a1是一维数组a1的首地址,即第1行一维数组中第0列元素的地址(&a10);即a1的值为&a10;,a2是一维数组a2的首地址,即第2行一维数组中第0列元素的地址(&a20);即a2的值为&a20;,因此,ai是第i行首元素的地址(指针),它是指向数组元素的指针。,4、ai+j表示地址:,ai是第i行首元素的地址。,a0+1表示第0行第1列元素的地址;,&a01,a0+2表示第0行第2列元素的地址;,&a02,a2+3表示第2行第3列元素的地址;,&a23,第i行第j列元素的地址(&aij);,5、*(a+i)表示地址:,*(a+i)等价于ai,第i行首元素的地址,6、*(a+i)+j表示地址:,*(a+i)+j等价于ai+j,第i行第j列元素的地址,7、数组元素aij的表示:,ai+j,*( ),*(a+i),+j,*( ),*(a+i),( ),j,若i=0,a0j可表示为:,*(a0+j)、*(*a+j)、(*a)j,若j=0,ai0可表示为:,*(ai)、*(*(a+i)、(*(a+i)0,8、(a+i)与*(a+i)的比较:,(a+i)等价于&ai,*(a+i)等价于ai,、都表示地址: a+i表示第i行的地址(行指针),*(a+i)表示第i行首元素的地址,、它们指向的数据类型不同: a+i指向一个一维数组(二维数组的一行、行指针); *(a+i)指向数组元素;,若进行操作:,(a+i)+1:使指针移动一维数组所占字节总数(一行、8字节),*(a+i)+1:使指针移动一个数组元素所占内存字节总数(2字节),9、对ai性质的进一步说明:,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)是二维数组元素aij的值。,10、关于&ai的说明:,、不要把&ai简单的理解为ai单元的物理地址,因为并不存在ai这个变量。它只是一种地址的计算方法,能得到第i行的首地址;,、&ai和ai的值是一样的,但它们的含义不同:,&ai或a+i指向行,而ai或*(a+i)指向列。,当列下标j为0时,&ai和ai(即ai+j)值相等,即指向同一位置。,、*(a+i)只是ai的另一种表示形式,不要简单的认为是“a+i所指单元的内容”。,对于二维数组:a+i=ai=*(a+i)=&ai=&ai0,它们的地址相等。,例:输出二维数组有关的值。,二、指向多维数组的指针变量,1、指向数组元素的指针变量,与指向一维数组元素的指针变量一样,它用来专门存放某个数组元素的内存地址。或者说,用于指向某个数组元素,定义方法与指向某种类型变量的指针变量一样。,2、指向一维数组的指针变量,定义: 类型名 (*指针变量名)n,如: int (*p)4,int a34;,、*p有4个元素,每个元素为整型;即p所指的对象是有4个整型元素的数组。p为行指针(a+i)。,、p只能指向一个包含4个元素的一维数组,p的值就是该一维数组的首地址。p不能指向一维数组中的元素;,、p+i表示二维数组中第i行的地址; *(p+i)+j表示第i行第j列元素的地址; *(*(p+i)+j)即数组元素aij。,例:输出二维数组中任一行任一列元素的值。,scanf(“%d%d“, ,5.5.2 通过指针在函数间传递多维数组,用数组名作实参,则是将二维数组首行的指针常量(二维数组名)传递给了作为函数形参的指针变量,该指针变量就指向了二维数组的第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)j,int max_value(int pb 4, int n),int max_value(int 4, int ),int max_value(int (*)4, int ),方法二、,int max_value(int *p,

温馨提示

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

评论

0/150

提交评论