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

下载本文档

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

文档简介

1、2022-5-241 Program Design in C LanguagePage第十讲第十讲第八章第八章 指针指针 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量字符串的指针和指向字符串的指针变量字符串的指针和指向字符串的指针变量2022-5-242 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 数组的指针:数组的首地址。数组的指针:数组的首地址。一维数组的指针:一维数组的首地址,也就一维数组的指针:一维数组的首地址,也就是一维数组中第一个元素的地址。是一维数组中第一个元素的地址。C语言规定:数组名代

2、表数组的首地址。语言规定:数组名代表数组的首地址。 若有:若有:int a10; 则:则:a 与与 a0 是等价的是等价的 数组元素的指针:数组元素的地址。数组元素的指针:数组元素的地址。 指向一维数组元素的指针变量:存放一维数组指向一维数组元素的指针变量:存放一维数组首地址或数组元素地址的变量。首地址或数组元素地址的变量。2022-5-243 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 一维数组的首地址加上偏移量一维数组的首地址加上偏移量x即可得到其他数即可得到其他数组元素的地址。组元素的地址。 例如:例如: int

3、 a10, *p; p=a; /* 等价于等价于 p=&a0 */ 则有:则有: &a1 等价于等价于 a+1 或或 p+1 &ai 等价于等价于 a+i 或或 p+i 注意:注意:p+i指向数组的第指向数组的第i个元素,而不是简单地个元素,而不是简单地使指针变量使指针变量p的值加的值加i。其所代表的地址实际上是。其所代表的地址实际上是p+isize(size为一个数组元素所占的字节数)。为一个数组元素所占的字节数)。2022-5-244 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 访问一个数组元素主要有两种形式:访问

4、一个数组元素主要有两种形式:下标法:用下标法:用 ai 的形式存取数组元素。的形式存取数组元素。指针法:用指针法:用 *(a+i) 或或 *(p+i) 的形式存取数组的形式存取数组元素。元素。 其中其中a是一维数组名,是一维数组名,p是指向数组元素的指是指向数组元素的指针变量。针变量。p的初值为数组的初值为数组a的首地址,可以通的首地址,可以通过指针变量赋值或加过指针变量赋值或加/减一个整数使减一个整数使p指向不指向不同的数组元素。同的数组元素。 例如:例如:int a10, *p=a; p+; /* p指向指向a1 */ p=a+5; /* p指向指向a5 */2022-5-245 Prog

5、ram Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 例例 通过下标法存取数组元素通过下标法存取数组元素#include void main( ) int a10, i; for(i=0; i10; i+) scanf(%d, &ai); for(i=0; i10; i+) printf(%5d, ai); printf(n);2022-5-246 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 例例 通过数组名计算元素地址存取数组元素通过数组名计算元素地址存取数组

6、元素#include void main( ) int a10, i; for(i=0; i10; i+) scanf(%d, a+i); for(i=0; i10; i+) printf(%5d, *(a+i); printf(n);2022-5-247 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 例例 通过指针变量存取数组元素通过指针变量存取数组元素#include void main( ) int a10, *p; for(p=a; pa+10; p+) scanf(%d, p); for(p=a; pa+10;

7、 p+) printf(%5d, *p); printf(n);2022-5-248 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 用指针法访问数组元素的注意事项:用指针法访问数组元素的注意事项:数组名是一个常量,不允许重新赋值。数组名是一个常量,不允许重新赋值。p+i和和a+i均表示数组元素均表示数组元素ai的地址,均指向的地址,均指向ai。 *(p+i)和和*(a+i)均表示均表示p+i和和a+i所指对象的内所指对象的内容,即容,即ai。 *p+ 等价于等价于 *(p+),其作用是先得到,其作用是先得到*p,再使再使

8、p=p+1。2022-5-249 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 用指针法访问数组元素的注意事项:用指针法访问数组元素的注意事项:(*p)+:表示将:表示将p所指向元素的值加所指向元素的值加1。 例如:例如: int a5=0, 2, 4, 6, 8, *p; p=a+2; (*p)+; printf(%dn, *p); 程序段输出结果为:程序段输出结果为:52022-5-2410 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 例例

9、分析下面程序的输出结果分析下面程序的输出结果#include void main( ) int a5=0, 2, 4, 6, 8, *p, i; p=a; (*p)+; p=a+1; +(*p); p=a+2; (*p)-; p=a+3; -(*p); for(i=0; i=4; i+) printf(%5d, ai); printf(n);程序运行结果程序运行结果: 1 3 3 5 82022-5-2411 Program Design in C LanguagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 用指针法访问数组元素的注意事项:用指针法访问数组元素的注意事项:

10、实际上是变址运算符,即编译时是将数组实际上是变址运算符,即编译时是将数组元素元素ai处理成处理成*(a+i)的。因此指向数组元素的。因此指向数组元素的指针变量也可带下标。的指针变量也可带下标。 例如:例如:*(p+i) 可以表示成可以表示成 pi。 注意:如果注意:如果p不指向不指向a0,则,则pi和和ai是不一是不一样的。样的。 例如:例如:int a10, *p; p=a+3; /* p指向指向a3 */ p3=25; /* p3等价于等价于a6 */ 这种方式容易出错,一般不提倡使用。这种方式容易出错,一般不提倡使用。2022-5-2412 Program Design in C Lan

11、guagePage8.3.1 一维数组的指针和指向一维数组元素的指针变量 数组元素的访问小结数组元素的访问小结int i, a10, *p=a;表表 现现 形形 式式含含 义义&a0 a p一维数组首地址一维数组首地址&ai a+i p+i一维数组下标为一维数组下标为 i 的元素地址的元素地址a0 *a *p一维数组下标为一维数组下标为 0 的元素的的元素的值值ai *(a+i) pi *(p+i) 一维数组下标为一维数组下标为 i 的元素的值的元素的值2022-5-2413 Program Design in C LanguagePage数组名作为函数参数 一维数组名作为函数参数的特点:一维

12、数组名作为函数参数的特点: 作为实参的数组名表示数组的首地址,是一个作为实参的数组名表示数组的首地址,是一个地址常量;地址常量; 作为形参的数组名并不表示数组的首地址,它作为形参的数组名并不表示数组的首地址,它不是一个地址常量而是一个指针变量;不是一个地址常量而是一个指针变量; 在函数调用时,实参向形参传递数组的首地址;在函数调用时,实参向形参传递数组的首地址; 可以用指向数组元素的指针变量作为函数参数。可以用指向数组元素的指针变量作为函数参数。2022-5-2414 Program Design in C LanguagePage例例 用冒泡法对用冒泡法对10个整数由大到小排序个整数由大到小

13、排序#include void sort(int , int);void main( ) int *p, i, a10; printf(Input data:n); for(i=0; i10; i+) scanf(%d, a+i); sort(a, 10); for(p=a; pa+10; p+) printf(%5d, *p); printf(n);void sort(int x , int n) int *x_end, *y, temp; x_end = x+n;for( ; xx_end-1; x+) for(y=x+1; y*x) temp=*x; *x=*y; *y=temp; 数组

14、名作为函数参数 2022-5-2415 Program Design in C LanguagePage8.3.2 二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量二维数组的存储结构是按行顺序存放的。二维数组的二维数组的存储结构是按行顺序存放的。二维数组的地址有两种:行地址(每行都有一个确定的地址)和列地址有两种:行地址(每行都有一个确定的地址)和列地址(数组元素的地址)。二维数组的行地址在数值上地址(数组元素的地址)。二维数组的行地址在数值上与行中首元素的地址相等,但意义不一样。对行地址进与行中首元素的地址相等,但意义不一样。对行地址进行运算,得到的是行的首元素的

15、地址,对列地址进行运行运算,得到的是行的首元素的地址,对列地址进行运算,得到的是数组元素的地址。算,得到的是数组元素的地址。1. 二维数组的指针二维数组的指针2022-5-2416 Program Design in C LanguagePage8.3.2 二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量例如:例如:int a34=0,1,2,3,4,5,6,7,8,9,10,11;a+1代表第代表第1行的地址,行的地址,a+2代表第代表第2行的地址行的地址而而a0、a1、a2是一维数组名,分别代表对应的一是一维数组名,分别代表对应的一维数组的地址,即维数组的地址,

16、即a0=&a00,a1=&a10,则,则a0+1=&a01,ai+j=&aij二维数组中,可用指针的形式表示各元素地址。二维数组中,可用指针的形式表示各元素地址。a0与与*(a+0)等价,等价,ai+j与与*(a+i)+j等价,则等价,则*(*(a+i)+j)与与*(ai+j)、aij等价等价2022-5-2417 Program Design in C LanguagePage8.3.2 二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量a+i和和*(a+i)在数值上相同,但意义不同。在数值上相同,但意义不同。a+i代表二代表二维数组第维数组第i行的地址,即行地址;

17、而行的地址,即行地址;而*(a+i)代表二维数组第代表二维数组第i行第行第0列元素的地址,即列地址。列元素的地址,即列地址。行地址以行为单位进行控制,列地址以数组元素为单行地址以行为单位进行控制,列地址以数组元素为单位进行控制。位进行控制。2022-5-2418 Program Design in C LanguagePage8.3.2 二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量例例 用指针法输入输出二维数组各元素。用指针法输入输出二维数组各元素。#include void main() int a34,*ptr,i,j;ptr=a0;printf(“Plea

18、se input data:n”);for(i=0;i3;i+) for(j=0;j4;j+) scanf(“%d”,ptr+);ptr=a0;for(i=0;i3;i+) for(j=0;j4;j+) printf(“%-3d”,*ptr+);printf(“n”);2022-5-2419 Program Design in C LanguagePage8.3.2 二维数组的指针和指向二维数组的指针变量二维数组的指针和指向二维数组的指针变量指向二维数组元素的指针变量指向二维数组元素的指针变量定义方法与指向一维数组元素的指针变量相同,指向定义方法与指向一维数组元素的指针变量相同,指向二维数元素

19、的指针变量不能指向二维数组的行,只能指二维数元素的指针变量不能指向二维数组的行,只能指向数组元素。向数组元素。指向具有指向具有m个元素的一维数组的指针变量个元素的一维数组的指针变量类型说明符类型说明符 (*指针变量名指针变量名) 常量表达式常量表达式例例 int a34,(*p)4; p=a;2.指向二维数组的指针变量指向二维数组的指针变量2022-5-2420 Program Design in C LanguagePage#includevoid main()int a34=1,3,5,7,9,11,13,15,17,19,21,23,sum; int i,(*b)4; float ave

20、age;for(b=a;ba+3;b+) sum=0; for(i=0;i4;i+) sum+=*(*b+i);averge=sum/4.0;printf(“average=%.2fn”,average);例例 指向具有指向具有m个元素的一维数组的指针变量个元素的一维数组的指针变量2022-5-2421 Program Design in C LanguagePage8.4.1 字符串指针变量的定义与引用 字符串常量的处理是用字符数组来实现的。也字符串常量的处理是用字符数组来实现的。也就是说,无论是否定义了字符数组,对于程序就是说,无论是否定义了字符数组,对于程序中出现的字符串,系统都会在内存

21、中开辟一个中出现的字符串,系统都会在内存中开辟一个字符数组连续存储空间来存放该字符串常量。字符数组连续存储空间来存放该字符串常量。 字符串的指针:字符串的首字符地址,也就是字符串的指针:字符串的首字符地址,也就是存放字符串的字符数组的首地址。存放字符串的字符数组的首地址。 字符串指针变量:通常把字符串指针变量:通常把char型指针变量称为型指针变量称为字符串指针变量。也就是说,指向字符串的指字符串指针变量。也就是说,指向字符串的指针变量等同于指向字符数组元素的指针变量,针变量等同于指向字符数组元素的指针变量,可以指向字符串中的任意一个字符。可以指向字符串中的任意一个字符。2022-5-2422

22、 Program Design in C LanguagePage8.4.1 字符串指针变量的定义与引用 字符串指针变量的定义和初始化字符串指针变量的定义和初始化方式一:将存放字符串的字符数组名赋给字符方式一:将存放字符串的字符数组名赋给字符串指针变量,让字符串指针变量指向字符串的串指针变量,让字符串指针变量指向字符串的首字符,然后通过移动指针变量来访问字符串首字符,然后通过移动指针变量来访问字符串的其他字符。的其他字符。 例如:例如: char str = Welcome to China!; char *p; p = str; /* 等价于等价于 p = &str0 */2022-5-24

23、23 Program Design in C LanguagePage8.4.1 字符串指针变量的定义与引用 字符串指针变量的定义和初始化字符串指针变量的定义和初始化方式二:在程序中定义一个字符串指针变量,方式二:在程序中定义一个字符串指针变量,并将字符串的首地址直接赋给它,然后通过移并将字符串的首地址直接赋给它,然后通过移动指针变量来访问字符串的其他字符。动指针变量来访问字符串的其他字符。 例如:例如: char *p = Welcome to China!; 等价于:等价于: char *p; p = Welcome to China!; 这里的字符串指针变量这里的字符串指针变量p指向字符

24、串的首字符,指向字符串的首字符,即第一个字符即第一个字符W。2022-5-2424 Program Design in C LanguagePage例例 用字符串指针变量实现字符串操作用字符串指针变量实现字符串操作#include void main( ) char *str = Welcome to China!; printf(%sn, str); /*整体引用字符串整体引用字符串*/ for ( ; *str!=0; str+ ) printf(%c, *str); /*逐个引用字符串中的字符逐个引用字符串中的字符*/ printf(n);8.4.1 字符串指针变量的定义与引用 程序运行

25、结果程序运行结果:Welcome to China!Welcome to China!2022-5-2425 Program Design in C LanguagePage8.4.2 字符串指针变量与字符数组 字符数组是由若干个元素组成,每个元素存放一字符数组是由若干个元素组成,每个元素存放一个字符;而字符串指针变量存放的是字符串中某个字符;而字符串指针变量存放的是字符串中某一个字符的地址。一个字符的地址。赋值方式不同。字符数组只能对各个元素分别赋赋值方式不同。字符数组只能对各个元素分别赋值,而字符串指针变量只用赋给字符串的首地址值,而字符串指针变量只用赋给字符串的首地址就可以了。就可以了。

26、 例如,下面的赋值是正确的:例如,下面的赋值是正确的: char *str; str = Welcome to China!; /*str是指针变量是指针变量*/ 下面的赋值是错误的:下面的赋值是错误的: char str30; str = Welcome to China!; /*str是数组名是数组名*/2022-5-2426 Program Design in C LanguagePage8.4.2 字符串指针变量与字符数组 字符串指针变量占用的内存要少于字符数组。字符串指针变量占用的内存要少于字符数组。 例如,编译系统为下面二维字符数组的定义及初始例如,编译系统为下面二维字符数组的定义

27、及初始化分配了化分配了36个字节的内存空间:个字节的内存空间: char str218 = Hello, Welcome to China!; 为下面两个字符串指针变量的定义及初始化分配了为下面两个字符串指针变量的定义及初始化分配了27个字节的内存空间:个字节的内存空间: char *str1 = Hello, *str2 = Welcome to China;字符串指针变量的值是可以改变的,而字符数组的字符串指针变量的值是可以改变的,而字符数组的数组名永远代表该数组的首地址,它的值是不会变数组名永远代表该数组的首地址,它的值是不会变化的。化的。2022-5-2427 Program Desi

28、gn in C LanguagePage例例 将字符串将字符串str1复制到字符串复制到字符串str2#include void main( ) char str1 =Copy string, str230; char *p1=str1, *p2=str2; while(*p1!=0) *p2+=*p1+; *p2=0; printf(String str2 = ); puts(str2);程序运行结果程序运行结果:String str2 = Copy string8.4.2 字符串指针变量与字符数组 2022-5-2428 Program Design in C LanguagePage8.

29、4.3 字符串指针变量作为函数参数 特点:特点: 用字符数组名或字符串指针变量名作为实参,用字符数组名或字符串指针变量名作为实参,向形参传递字符串的首地址;向形参传递字符串的首地址; 作为形参的字符数组或字符串指针变量本质上作为形参的字符数组或字符串指针变量本质上都是字符串指针变量;都是字符串指针变量; 在被调用函数中可以改变字符串的内容,在主在被调用函数中可以改变字符串的内容,在主调函数中可以得到改变以后的字符串。调函数中可以得到改变以后的字符串。2022-5-2429 Program Design in C LanguagePage例例 连接两个字符串连接两个字符串str1和和str2,连

30、接结果放在,连接结果放在str1中中#include void strlink(char *, char *);void main( ) char str115=Hello , str2 =World!; strlink(str1, str2); printf(String str1 = %sn, str1);void strlink(char *s, char *t) while(*s!=0) s+; /* 使使s指向字符串指向字符串str1的末尾的末尾 */ while(*t!=0) *s+=*t+; /* 将将str2中的字符逐个连接到中的字符逐个连接到str1的末尾的末尾 */ *s=

31、0; /* 在在str1的末尾加上字符串结束标志的末尾加上字符串结束标志 */程序运行结果程序运行结果:String str1 = Hello World!8.4.3 字符串指针变量作为函数参数 2022-5-2430 Program Design in C LanguagePage8.4.3 字符串指针变量作为函数参数 指针变量作为函数参数小结:指针变量作为函数参数小结:实实 参参形形 参参数组名数组名(数组首地址数组首地址)数组名数组名(指针变量指针变量)指针变量指针变量指针变量指针变量2022-5-2431 Program Design in C LanguagePage8.5 指针数组

32、指针数组指针数组:数组中的每个元素都是指向同类对象的指指针数组:数组中的每个元素都是指向同类对象的指针数据。即,指针数组中的每一个元素都是指针变量。针数据。即,指针数组中的每一个元素都是指针变量。定义格式:定义格式: 类型说明符类型说明符 *数组名数组名常量表达式常量表达式如;如; int *a5;2022-5-2432 Program Design in C LanguagePage8.5 指针数组指针数组例:输入一个从星期日到星期六中一天的英文字符串,判断它是一个星期例:输入一个从星期日到星期六中一天的英文字符串,判断它是一个星期的第几天,如果该字符串不存在,输出的第几天,如果该字符串不存在,输出-1。#includechar *week8=“Sunday”,”Monday”,”Tuesday”,”Wednesday”,”Thursday”,”Friday”,”Saturday

温馨提示

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

最新文档

评论

0/150

提交评论