C语言程序设计第八章指针_第1页
C语言程序设计第八章指针_第2页
C语言程序设计第八章指针_第3页
C语言程序设计第八章指针_第4页
C语言程序设计第八章指针_第5页
已阅读5页,还剩101页未读 继续免费阅读

下载本文档

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

文档简介

1、第八章 指针,8.1 概 述,C程序设计中使用指针可以: 使程序简洁、紧凑、高效 有效表示复杂的数据结构 动态分配内存 方便使用字符串 有效使用数组 调用函数时可以得到多于1个的值 直接处理内存地址,8.2 指针的概念,一、数据的存取,1、内存地址,内存的每个字节都有一个编号,这个编号称为“内存地址”。,程序中的每个数据都对应着内存中的一个地址,从该地址开始的一个或多个字节用来存放该数据。,int i, j, k;,i,j,k,2、内存单元的地址和内存单元的内容的区别:,若i=3, j=5;,从图中可以看出它们的区别。,程序编译后已经没有i、j、k这些变量名了,而是将变量名转换为变量的地址,计

2、算机通过内存地址对变量进行存取。,二、直接访问和间接访问,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,现在要存取

3、i的值可以这样做:先找到存放i的地址的内存单元地址(3000和3001),从中取出变量i的地址(2000),然后再对2000和2001单元进行存取这就称为间接访问。,通过变量ip知道变量i的地址,从而找到变量i的内存单元,因此说变量ip指向变量i,用箭头表示这种“指向”关系。,变量ip的值为2000,即变量i的地址,这样就在ip和 i 之间建立了一种联系:,3、关于“指向”的含义:,4、为了表示将数值10送到变量i中,可以有两种表示方法:,、将10送到变量i所标志的单元中;,10,、将10送到变量ip所指向的单元中;,10,三、指针与指针变量,通过地址能找到所需的变量单元,可以说:地址“指向”

4、该变量单元。因此,把一个变量的地址称为该变量的“指针”。,如果一个变量专门用来存放另一个变量的地址,则称它为“指针变量”。指针变量的值(即指针变量中存放的值)是指针(地址)。,注意区分“指针”和“指针变量”这两个概念。,指针与指针变量 指针:一个变量的地址 指针变量:专门存放变量地址的变量,2000,指针,指针变量,变量的内容,变量的地址,、数据所占有的内存单元个数是由其数据类型决定的;,、首地址:即第一个单元的地址;,、表示地址的数与整数的区别;,、变量i、j的地址可能相邻,也可能不相邻,是由系统分配的,我们不必关心。,、程序中定义的每个变量在编译后都占有各自的内存单元,系统是通过内存地址对

5、变量进行存取的;,四、说明,8.3 指针变量的定义和引用,指针运算符:*,为了表示指针变量和它所指向的变量之间的联系,用“*”表示指向的关系。,如:ip代表指针变量,*ip表示ip所指向的变量。即*ip也代表一个变量。,例:,、若:ip=,*ip=5;,结论:*ip与i等价。,、x=i+1;,x=*ip+1;,取地址运算符:,、不能把一个指针变量的值赋值给一个整型变量:x=ip;, float *q ; static char *name;,存储类型 数据类型 *指针变量名;,说明:, “*”只表示定义的变量为指针变量,但指针变量名中并不包含“*”;*是指针变量的标志,不可丢掉;, 指针变量定

6、义时,指定了它所指向的变量的数据类型;指针变量定义时必须指定其所指向的变量的数据类型,而且使用过程中只能指向同一种类型的变量。, 指针变量定义后,系统为变量分配一个存储单元,用来存放地址;根据存储单元的长度分为大存储模式(长指针,4 Byte)和小存储模式(短指针,2 Byte);, 指针变量定义后,若不赋值,其值是不确定的。,二、指针变量的赋值,1、赋值语句:,int i, j, *p1, *p2;,p1=,char ch, *cp1, *cp2;,cp1=,2、初始化:,int i, *p1=,int i, *p1; p1=,一般形式: 存储类型 数据类型 *指针变量名=初始地址值;,赋给

7、指针变量, 不是赋给目标变量,例 int i; int *p=,变量必须已说明过 类型应一致,例 int i; int *p=,用已初始化指针变量作初值,例 main( ) int i; static int *p= . (),不能用auto变量的地址 去初始化static型指针,3、说明:,、指针变量定义后,若不赋值,其值是不确定的;,、可以给指针变量赋空值(NULL),使指针变量不指向任何变量;,ip=NULL;,#define NULL 0,、指针变量的值为空值(NULL)与未对指针变量赋值,意义不同;,、只能是同类型变量的地址进行赋值;,int i, *ip; char ch, *cp

8、;,ip=,ip=,、可以将数组名或函数名赋给某些类型的指针变量;,int a10, *ip;,ip=,ip=a;,、不能将一个整型量(或任何其它非地址类型的数据)赋给一个指针变量;,int *ip;,ip=3000;,8.3.2 指针变量的引用,int a, *p1, *p2; p1=,int a, *p1, *p2;,p1=,p2=p1;,3,printf(%d, *p1);,1、两个运算符: p=,int a, *p; *p=,3、指针变量可以进行的操作:,int a, *p1, *p2;,、赋值:,p1=,p2=p1;,、输出:,printf(%x, p1);,、取内容:,*p1=5;

9、,a=5;,printf(%d, *p1);,例8.1,#include void main( ) int a1=11, a2=22; int *p1, *p2; p1= , int *p1, *p2, *p; p1= , int *p1, *p2; p1= , temp=x; x=y; y=temp; void main( ) int a, b; printf(nInput a, b: ); scanf(%d%d, ,注意:语言中的函数调用采用“传值”方式,即单向传递方式。,即:主调函数可以将实参的值传递给被调函数的形参,但不能通过改变形参的值而改变实参的值。,Eg804.cpp,#incl

10、ude 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=*px; *px=*py; *py=*temp; void main( ) int a, b, *p1, *p2; printf(nInput a, b: ); scanf(%d%d, ,*temp是指针变量temp所指向的变量,但temp中并无确定的地址值,其值不确定;*temp所指向的单元也不确定。因

11、此,对*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, , /* 定义包含10个整型元素的数组a */ int *p; /* 定义指向整型变量的指针变量p */ 指向数组元素的指针变量,其类型应与数组元素相同 为了让指针p指向数组a,应把数组a的地址赋

12、给指针变量p,赋值:,p=,、定义时可以进行初始化:,int *p=,int *p; p=,int *p; *p=,int *p=a;,8.4.2 通过指针访问一维数组,int a10; int *p; 如果: p = a; (或 p = ) 则,*p=5;,a0=5;,p=,*p=5;,a3=5;,又如果:,当指针p指向数组a后,可用指针p访问数组的各个元素。,通过指针访问一维数组,C规定:若指针变量p已指向数组中的一个元素,则p1指向该数组中的下一个元素,如果指针p指向数组a(指向数组第一个元素a0),则:p+1指向下一个元素a1,注意不是将p值简单加1。如果数组元素是整型,p+1表示p的

13、地址加2;如果数组元素是实型,p+1表示p的地址加4;如果数组元素是字符型,p+1表示p的地址加1,通过指针访问一维数组,p+i指向元素ai。可以使用*(p+i)访问元素ai p+i也可以记作a+i。指向元素ai。 指向数组的指针变量也可以带下标,如,pi与*(p+i)等价,表示元素ai。,指针的运算,指针变量的赋值运算 p= (指针变量p2值p1) 不能把一个整数p,也不能把p的值整型变量,指针的运算,指针的算术运算 pi p id (i为整型数,d为p指向的变量所占字节数) p+, p-, p+i, p-i, p+=i, p-=i等 若p1与p2指向同一数组,p1-p2=两指针间元素个数(

14、p1-p2)/d p1+p2 无意义,指针的运算,例 p指向float数,则 p+1 p+1 4,例 p指向int型数组,且p= 则p+1 指向a1,例 int a10; int *p=,例 int a10; int *p1=,a0,a1,a2,a3,a4,a5,a6,a7,a8,a9,a数组,p,p+1,a+1,p+i,a+i,p+9,a+9,1,指针的运算,指针变量的关系运算 若p1和p2指向同一数组,则 p1p2 表示p1指的元素在后 p1=p2 表示p1与p2指向同一元素 若p1与p2不指向同一数组,比较无意义 p=NULL或p!=NULL,数组元素表示方法, 变址运算符 ai *(a

15、+i),ai pi *(p+i) *(a+i),通过指针访问一维数组,例10.1输出有10个元素的整型数组a中的全部元素 1、下标法(常用,很直观) main() int a10;int i; for(i=0;i10;i+) scanf(%d, ,例10.1输出有10个元素的整型数组a中的全部元素 1、下标法(常用,很直观) main() int a10;int i; for(i=0;i10;i+) scanf(%d, ,下标,通过指针访问一维数组,2、用数组名计算数组元素的地址。(效率与下标法相同,不常用) main() int a10;int i; for(i=0;i10;i+) scan

16、f(%d, ,数组名,通过指针访问一维数组,3.用指针访问各元素。(常用,效率高) main() int a10;int *p, i; for(i=0;i10;i+) scanf(%d, ,指针移动,通过指针访问一维数组,三种方法比较: 方法1、2费时,编译系统先将ai转换为*(a+i),即先计算元素地址; 方法3不用每次计算地址,执行效率高; 下标法直观。,通过指针访问一维数组,使用指针指向数组,应注意以下问题: 1.若指针p指向数组a,虽然p+i与a+i、*(p+i)与*(a+i)意义相同,但仍应注意p与a的区别(a代表数组的首地址,是不变的;p是一个指针变量,可以指向数组中的任何元素,实

17、现使自身的值改变) for(p=a; a(p+10); a+) printf(%d, *a) a代表数组的首地址,是不变的,a+不合法,通过指针访问一维数组,2.指针变量可以指向数组中的任何元素,在程序运行期间,要始终注意指针变量当前所指向的是哪一个元素 main() int *p, i, a10; p = a; for(i=0;i10;i+) scanf(%d, p+); printf(n); for(i=0;i10; i+,p+) printf(%d, *p); ,p=a;,通过指针访问一维数组,3.使用指针时,应特别注意避免指针访问越界。在上例中,第二次for循环,p已经越过数组的范围,

18、但编译器不能发现该问题。避免指针访问越界是程序员自己的责任。,通过指针访问一维数组,4.指针使用的几个细节: 设指针p指向数组a(p=a),则: p+(或 p += 1),p指向下一个元素a1。如执行*p,则取出a1的值 *p+,相当于*(p+)。因为,*和+同优先级,+是右结合运算符(p375)。则先得到*p,再执行p=p+1。 *(p+)与*(+p)的作用不同。 *(p+):先取*p,再使p加1。 *(+p):先使p加1,再取*p。,通过指针访问一维数组, (*p)+表示,p指向的元素值加1。 如果p当前指向数组a的第i个元素,则: *(p-)相当于ai-,先取*p,再使p减1。 *(+p

19、)相当于a+i,先使p加1,再取*p。 *(-p)相当于a-i,先使p减1,再取*p。,例 int a=1,2,3,4,5,6,7,8,9,10,*p=a,i; 数组元素地址的正确表示:(A) int y,*p= ,输出:5 6,例 注意指针变量的运算,6,8.4.3 通过指针在函数间传递一维数组,2、数组名作为函数参数:,void f(int x , int n);,f(a, 10);,数组名代表数组首地址。用数组名作实参,调用函数时是把数组首地址传递给形参,而不是把数组的值传给形参。这样,实参数组和形参数组共占同一段内存区域。从而在函数调用后,实参数组的元素值可能会发生变化。,x,x0,x

20、1,x2,x3,x4,x5,x6,x7,x8,x9,实际上能够接受并存放地址值的只能是指针变量,编译系统都是将形参数组名作为指针变量来处理的。,void f(int *x, int n);,通过指针在函数间传递一维数组,变量名与数组名作函数参数时的比较:,变量名,变量的值,不能,数组名或指针变量,数组的起始地址,能,需要说明的是: 语言的函数调用都是采用“值传递”方式;当用变量名作函数参数时传递的是变量的值;用数组名作函数参数时,由于数组名代表的是数组首地址,因此传递的是数组首地址,所以要求形参为指针变量。,归纳起来,实参与形参的对应关系有:,、形参和实参都用数组名:,f(int x , in

21、t 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);,实参通过指针变量为形参提供数组首地址;,void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i

22、=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,例 将数组a中的n个整数按相反顺序存放,实参与形参均用数组,m=4,void inv(int *x, int n) int t,*p,*i,*j,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j;

23、 *j=t; main() int i,a10=3,7,9,11,0,6,7,5,4,2; inv(a,10); printf(The array has been reverted:n); for(i=0;i10;i+) printf(%d,ai); printf(n); ,实参用数组,形参用指针变量,例 将数组a中的n个整数按相反顺序存放,void inv(int *x, int n) int t,*i,*j,*p,m=(n-1)/2; i=x; j=x+n-1; p=x+m; for(;i=p;i+,j-) t=*i; *i=*j; *j=t; main() int i,a10,*p=a

24、; for(i=0;i10;i+,p+) scanf(%d,p); p=a; inv(p,10); printf(The array has been reverted:n); for(p=a;pa+10;p+) printf(%d,*p); ,实参与形参均用指针变量,例 将数组a中的n个整数按相反顺序存放,void inv(int x, int n) int t,i,j,m=(n-1)/2; for(i=0;i=m;i+) j=n-1-i; t=xi; xi=xj; xj=t; main() int i,a10,*p=a; for(i=0;i10;i+,p+) scanf(%d,p); p=

25、a; inv(p,10); printf(The array has been reverted:n); for(p=arr;parr+10;p+) printf(%d ,*p); ,实参用指针变量,形参用数组,例 将数组a中的n个整数按相反顺序存放,8.5 指针与字符串,8.5.1 字符串表示形式 用字符数组实现,例 main( ) char string=“I love China!”; printf(“%sn”,string); printf(“%sn”,string+7); ,用字符指针实现,例 main( ) char *string=“I love China!”; printf(

26、“%sn”,string); string+=7; while(*string) putchar(string0); string+; ,字符指针初始化:把字符串首地址赋给string char *string; string=“I love China!”;,例:将字符串a复制到字符串b字符数组作参数 main() char a = I am a boy.;char b20;int i; for(i=0; *(a+i) !=0; i+) *(b+i) = *(a+i); *(b+i) = 0; printf(string a is: %sn,a); printf(string b is:);

27、 for(i=0; bi !=0; i+) printf(%c,bi); printf(n); ,将字符串a复制到字符串b用指针处理 main() char a=Iam a boy., b20, *p1, *p2;int i; p1 = a; p2 = b; for(; *p1 != 0; p1+, p2+) *p2 = *p1; *p2 = 0; printf(string a is: %sn, a);printf(string b is:); for(i=0; bi !=0; i+) printf(%c,bi);printf(n); ,8.5.2字符串指针作函数参数,将一个字符串从一个函数

28、传递到另一个函数,可以使用传地址的方式,即用字符数组名或字符指针变量作参数。有以下四种情况:,例 用函数调用实现字符串复制,(1)用字符数组作参数,(2)用字符指针变量作参数,void copy_string(char from,char to) int i=0; while(fromi!=0) toi=fromi; i+; toi=0; main() char a=I am a teacher.; char b=You are a student.; printf(string_a=%sn string_b=%sn,a,b); copy_string(a,b); printf(nstring

29、_a=%snstring_b=%sn,a,b); ,void copy_string(char *from,char *to) for(;*from!=0;from+,to+) *to=*from; *to=0; main() char *a=I am a teacher.; char *b=You are a student.; printf(string_a=%snstring_b=%sn,a,b); copy_string(a,b); printf(nstring_a=%snstring_b=%sn,a,b); ,对copy_string函数的几种简化- :,void copy_stri

30、ng(char *from, char *to) while(*to=*from) !=0) to+; from+ ,*to=*from是一个赋值表达式,其值等于*from。to+和from+分别使指针指向下一个字节。 先执行赋值表达式,再判赋值表达式的值(等于*from)是否为0,因此,from串中的结尾字符0被赋值给to。,对copy_string函数的几种简化- :,Void copy_string(char *from, char *to) while(*to+=*from+) != 0); ,*to+=*from+先执行*to=*from,再使to、from分别加1。,对copy_s

31、tring函数的几种简化- :,Void copy_string(char *from, char *to) while(*from != 0) *to+ = *from+; *to = 0; ,当遇到*from=0时,不执行赋值运算*to+=*from+,因此,最后应加一句*to=0,对copy_string函数的几种简化- :,Void copy_string(char *from, char *to) while(*to+=*from+); ,与第种简化相同,当*from=0时,表达式*to+=*from+的值等于0(假),结束while循环。,对copy_string函数的几种简化-

32、:,Void copy_string(char *from, char *to) for(;(*to+ =*from+) !=0;); 或 for(;*to+ =*from+;); ,for循环的结束条件是表达式*to+ =*from+的值(即*from的值)等于0。且form中的0已被赋给to。注意0的ASCII码是不是0。,对copy_string函数的几种简化- :,Void copy_string(char from, char to) char *p1, *p2; p1 = from; p2 = to; while(*p2+=p1+) !=0) ,形参用数组,使用局部指针变量指向形参

33、数组,字符指针变量与字符数组 char *cp; 与 char str20; str由若干元素组成,每个元素放一个字符;而cp中存放字符串首地址 char str20; str=“I love China!”; () char *cp; cp=“I love China!”; () str是地址常量;cp是地址变量 cp接受键入字符串时,必须先开辟存储空间,例 char str10; scanf(“%s”,str); () 而 char *cp; scanf(“%s”, cp); (),改为: char *cp,str10; cp=str; scanf(“%s”,cp); (),字符串与数组关

34、系 字符串用一维字符数组存放 字符数组具有一维数组的所有特点 数组名是指向数组首地址的地址常量 数组元素的引用方法可用指针法和下标法 数组名作函数参数是地址传递等 区别 存储格式:字符串结束标志 赋值方式与初始化 输入输出方式:%s %c,char str=“Hello!”; () char str=“Hello!”; () char str=H,e,l,l,o,!; () char *cp=“Hello”; () int a=1,2,3,4,5; () int *p=1,2,3,4,5; (),char str10,*cp; int a10,*p; str=“Hello”; () cp=“H

35、ello!”; () a=1,2,3,4,5; () p=1,2,3,4,5; (),8.6 指针与多维数组,8.6.1多维数组的地址 二维数组 static int a34 = 1,3,5,7,9,11,13,15,17,19,21,23; 理解为: 有三个元素a0、a1、a2,每一个元素代表一行,每一个元素是一个包含4个元素的数组。,多维数组的地址,a,a+1,a+2,2000,a0+1,a0+2,a0+3,指向多维数组的指针变量,例:用指针变量输出数组元素的值。 main() static int a34 = 1,3,5,7,9,11,13,15,17,19,21,23; int *p;

36、 for(p=a0; pa0+12; p+) if ( (p-a0)%4 = 0) printf(n); printf(%4d, *p); ,指向多维数组的指针变量,注意:本例用指针顺序访问二维数组的元素。若需访问二维数组anm(n行m列)的某个元素aij,计算该元素的相对位置公式为: i*m+j (i,j=0,1,2, .) 这种方法相当于把二维数组转化为一维数组来使用。,指向多维数组的指针变量,直接用二维数组下标访问元素: main() static int a34 = 1,3,5,7,9,11,13,15,17,19,21,23; int i,j; for(i=0; i3; i+) fo

37、r(j=0;j4;j+) printf(%4d,aij); printf(n); 方式虽然清晰,但需进行两层循环,且为了计算每一个元素aij的位置,均进行i*4+j的运算,执行效率非常低。,8.7 指针与函数,C语言中的指针,既可以指向变量(整型、字符型、实型、数组等),也可以指向程序的代码(如函数)。 一个函数在编译时被分配一个入口地址(第一条指令的地址),这个入口地址称为函数的指针。如果一个指针变量的值等于函数的入口地址,称为指向函数的指针变量。 可以通过函数指针来调用函数。,指针与函数,函数指针:函数在编译时被分配的入口地址,用函数名表示,p,指向函数的指针变量,例 用函数指针变量调用函

38、数,比较两个数大小,main() int max(int ,int); int a,b,c; scanf(%d,%d, ,main() int max(int ,int), (*p)(); int a,b,c; p=max; scanf(%d,%d, ,指向函数的指针变量,函数指针变量赋值:如p=max;,函数返回值的数据类型,专门存放函数入口地址 可指向返回值类型相同的不同函数,定义形式: 数据类型 (*指针变量名)(形参类型 ); 如 int (*p)();,函数指针变量指向的函数必须有函数说明,函数调用形式: c=max(a,b); c=(*p)(a,b); c=p (a,b); 对函数

39、指针变量pn, p+, p-无意义,例 用函数指针变量作参数,求最大值、最小值和两数之和,用函数指针变量作函数参数,返回指针的函数,一般形式: 类型标识符 * 函数名(参数表) 例、int *a (int x, int y) 声明一个函数,函数名为a,其返回值类型是“指向整型的指针”,函数形式参数为 int x 和 int y,例 有若干学生的成绩(每个学生四门课程),要求用户在输入学生序号(从开始)后,能输出该学生的全部成绩。 分析:设计一个指针pointer指向一个学生的四门成绩 float (*pointer)4,pointer是一个指向一维数组的指针。数组元素个数为4(四门课程) po

40、inter+1指向下一个学生的成绩。 输入学生序号后,使pointer指向该学生的成绩,然后返回pointer指针,main() float score4=60,70,80,90, 56,89,67,88,34,78,90,66; float *search(float (*pointer)4,int n), *p; int i,m; printf(Enter the number of student:); scanf(%d, ,例 对上例中的学生,找出有不及格成绩的学生及其学号。 分析:上例中search函数返回学生成绩的首地址。本例用返回地址区分学生成绩中有无不及格课程,若有不及格课程时

41、,仍返回学生成绩的首地址;若无不及格课程,则返回学生成绩的末地址(等于下一个学生的首地址)。,float * search( float (*pointer)4 ); void main()static float score4 =60,70,80,90,56,89,67,88,34,78,90,66 ;float *p;int i, j; for(i=0; i3; i+) /* 三个学生 */p = search(score+i);if (p = *(score+i) /* p指向i号学生成绩首地址,该生有不及格课程 */ printf(No.%d scores:t, i); /* 显示该生

42、的四门课程成绩 */ for(j=0; j4; j+)printf(%5.2t, *(p+j); printf(n); ,float * search( float (*pointer)4 )int i;float *pt;pt = *(pointer + 1); /*设pt指向成绩末地址(等于下一个学生成绩首地址),即先假设无不及格成绩 */for(i=0; i4; i+) /* 查四门课程中有无不及格成绩 */if ( *(*pointer+i)60 ) pt = *pointer; /*有不及格课程,pt指向成绩首地址*/return pt; ,8.8 指针数组,概念:指针数组是一个数组

43、,该数组中的每一个元素是指针变量。 形式: 存储类型 类型标识符 *数组名数组元素个数 例、 int *p4; 定义一个指针数组,数组名p,有4个元素, 每一个元素是指向整型变量的指针。 区分:int (*p)4(指向数组的指针)定义一个指针变量,它指向有4个元素的一维数组。,char name59=“gain”,“much”,“stronger”, “point”,“bye”;,用途:处理多个字符串。 字符串本身是一维数组,多个字符串可以用二维数组来处理,但会浪费许多内存。用指针数组处理多个字符串,不会浪费内存。,char *name5=“gain”,“much”,“stronger”, “

44、point”,“bye”;,二维数组存储空间固定 字符指针数组相当于可变列长的二维数组 分配内存单元=数组维数*2+各字符串长度,指针数组元素的作用相当于二维数组的行名 但指针数组中元素是指针变量 二维数组的行名是地址常量,指针数组赋值或初始化,赋值: main() int b23,*pb2; pb0=b0; pb1=b1; . ,int *pb2,int b23,初始化: main() int b23,*pb =b0,b1; . ,初始化: main() char *p =Fortran, Lisp, Basic,NULL; .,main() int b23,*pb2; int i,j; for(i=0;i2;i+) for(j=0;j3;j+) bij=(i+1)*(j+1); pb0=b0; pb1=b1; for(i=0;i2;i+) for(j=0;j3;j+,pbi+) printf(b%d%d:%2dn,i,j,*pbi); ,例 用指针数组处理二维数组,例 对字符串排序(简单选择排序),main() void sort(char *name,int n), print(char *name,

温馨提示

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

最新文档

评论

0/150

提交评论