c语言程序设计教学课件-第8章2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
例8.13 将字符串第n个字符开始复制到另一数组中。
#include "string.h"
main( )
{ int i,n; char a[]=“computer”,b[10],*p,*q;
p=a; q=b;
scanf("%d",&n);
if(strlen(a)<n) printf("error!\n");
a[0][0] 1
a[1][0] 5
a[2][0] 9
a[i]+1
a[0][1] 2
a[1][1] 6
a[2][1] 10
a[i]+2
a[0][2] 3
a[1][2] 7
a[2][2] 11
a[i]+3
a[0][3] 4
a[1][3] 8
a[2][3] 12
二维数组的指针表示
10
例8.9 :
main( ) { int a[2][3]={1,2,3,4,5,6},i,j,k,*p;
for(j=0;j<4;j++) if(max<*(*p+j)) { max=*(*p+j);m=i;n=j; }
printf("max is:a[%d][%d]=%d\n",m,n,max); }
15
8.3.3 用指向数组的指针作函数参数
用数组名作参数有以下4种情况: (1)实参和形参都是数组名; (2)实参是数组名,形参是指针变量; (3)实参是指针变量,形参是数组名; (4)实参和形参都是指针变量。
8
因此,a[0],a[1] 分别代表2行的首地址,而a[0]又可 以表示为*(a+0),a[1]可表示为*(a+1)。因此元素a[i][j]的地 址可表示为a[i]+j或*(a+i)+j。而元素值则表示为*(a[i]+j)或 *(*(a+i)+j)。
例如:a[0][2]元素可表示为*(a[0]+2)或*(*(a+0)+2)。 这就是二维数组元素的指针表示形式。由此得出二维数组 元素的三种表示形式:
for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%4d",*(a[i]+j));
printf("\n"); } for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%4d",*(*(a+i)+j));
printf("\n"); } p=*(a+0); for(i=0;i<2;i++) { for(j=0;j<3;j++) printf("%4d",*(p++));
14
例8.11 用行指针实现例8.10的功能。
main( ) { int i,j,m,n,max,(*p)[4];
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12}; p=a; max=*(*p+0); /*将第一个元素值赋给max*/ for(i=0;i<3;i++,p++)
printf("\n"); } }
11
2. 指向二维数组的指针变量
(1) 直接指向二维数组元素的指针变量 例8.10 找出二维数组中的最大元素,并指出其所在
的位置(行列号)。
main( ) /*用数组名法实现*/
{ int i,j,m,n,max,a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
7
8.3.2 指向二维数组的指针
1. 二维数组的地址 与一维数组类似,二维数组名代表二维数组的首地 址,但该地址是二级地址。 如有下面的定义: int a[2][3]={{1,2,3},{4,5,6}}; 对于第0行的元素a[0][0],a[0][1],a[0][2],可以看 成是一维数组a[0]的三个元素,即把a[0]看成一维数 组名,这样a[0]即代表第0行的首地址,也是第0行 第0列元素的地址:&a[0][0]。
exam BASIC PASCAL FORTRAN↙
运行结果:
argc=4 参数0:exam 参数1:BASIC 参数2:PASCAL 参数3:FORTRAN
25
argv
argv[0]
argv[1]
e x a m \0 B A S I C \0
argv[2]
P A S C A L \0
argv[3]
The new string is: abcdef
main()
The new string is: abcdef
{ char c1[10]= “abc”,c2[]=“def”,*p;
p=str_cat(c1,c2);
printf("The new string is:%s\n",p);
printf("The new string is:%s\n",c1); }
16
例8.12 求二维数组中全部元素之和。
int fun(int a[ ],int n)/* 形参为数组,也可为*a */ { int k,sum=0;
for(k=0;k<n;k++) sum+=a[k]; /* 也可*a++ */ return(sum); } main( ) { int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12},*p,total; p=a[0]; total=fun(p,12); /*用指针变量作实参*/ printf(“total=%d\n”,total); }
c语言程序设计教学课件-第8章2
第八章 指针
8.3 指针与数组 8.4 指针与字符串 8.5 指针数组与命令行参数 8.6 程序举例
3
8.3 指针与数组
8.3.1 指向一维数组的指针
将一个一维数组的起始地址(数组名)赋给一个指针变量, 则该指针变量就是一个指向一维数组的指针。例如:
int a[5]={1,2,3,4,5},*p;
printf("max is:a[%d][%d]=%d\n",m,n,max);
}
13
(2) 指向二维数组一行的指针
指向二维数组一行的指针亦称行指针。 行指针定义形式为:
类型标识符 (*指针变量名)[元素个数]; 例如:
int a[3][5], (*p)[5];
p=a;
/*或p=a+0;*/
由于p是行指针,所以p+1不是指向数组的下一元素 a[0][1],而是指向下一行a[1]。
String b:mputer
19
8.4.2 字符指针与字符数组的区别
(1变量,其值可以是字符串的首地址(指向这个 字符串)也可以是字符变量的地址(指向这个字符变量),字符 指针的值是可以改变的。
(2)赋值方式不同。 对于字符数组c可以
#include "stdio.h" main(int argc,char *argv[]) { int i=0;
printf("argc=%d\n",argc); while(argc>=1) { printf("参数%d:%s\n",i,*argv);
i++; argc--; argv++; } } 若运行该程序时在命令行输入的是:
{ int i,j,m,n,max,*p;
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
p=a[0];
max=*p;
/*将第一个元素值赋给max*/
for(i=0;i<3;i++)
for(j=0;j<4;j++,p++)
if(max<*p)
{ max=*p;m=i;n=j; }
1、a[i][j](下标法) 2、*(a[i]+j)(一维数组名法) 3、*(*(a+i)+j)(二维数组名法)。
9
二维数组的指针表示如图所示: int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
a[0] *(a+0) a[1] *(a+1)
a[2] *(a+2)
a[i]+0
else
{ p=p+n-1;
/*指针指向要复制的第一个字符*/
for(;*p!='\0';p++,q++)
*q=*p;
*q='\0'; printf("String a:%s\n",a); printf("String b:%s\n",b); }}
输入: 3↙ 输出:
String a:computer
22
8.5 指针数组与命令行参数
8.5.1 指针数组 指针数组的定义形式为:
类型标识符 *数组名[常量表达式]; 例如:
char *p[3]; p[0]= "BASIC"; p[1]= "PASCAL"; p[2]= "FORTRAN"; 或: char *p[3]={"BASIC","PASCAL","FORTRAN"};
p=a;
或:
p=&a[0];
p
注意:此时可进行p++;p=p+2;
但不可做a++;a=a+2;
a数组
1
a[0]
2
a[1]
3
a[2]
4
a[3]
5
a[4]
4
若有如下定义: int a[5]={0,2,4,6,8},*p=a; 则a数组中第i个元素可用以下4种方法表 示: (1)下标法:a[i]。 (2)数组名法:*(a+i)。 (3)指针法:*(p+i)。 (4)指针下标法:p[i]。
17
8.4 指针与字符串
8.4.1 指向字符串的指针 指向字符串的指针称为字符指针,其定义形式是: char *指针变量名; 例如: char c[5]="book",*p; p=c; 请看下列程序: main() { char c="book",*p;
p=c; printf("%s\n",c);printf("%s\n",p); }
5
例8.7 使用不同方法输出整型数组a各元素。
main( ) { int a[5]={1,2,3,4,5},i,*p;
for(i=0;i<5;i++) printf("%4d",a[i]); printf("\n"); for(i=0;i<5;i++) printf("%4d",*(a+i)); printf("\n"); for(p=a;p<a+5;p++) printf("%4d",*p); printf("\n"); p=a; for(i=0;i<5;i++) printf("%4d",p[i]); }
char c[20]="computer"; 但不可以
char c[20]; c="computer"; 而对于字符指针p,既可以 char *p="computer"; 也可以 char *p; p="computer";
20
用字符指针作函数的参数,也有4种情况: (1)实参形参都是字符数组名; (2) 实参是字符数组名,形参是字符指针变量; (3) 实参是字符指针变量,形参是字符数组名; (4) 实参和形参都是字符指针变量。
23
8.5.2 指针数组与命令行参数
带形参的main()函数的一般形式是: main(int argc,char *argv[]) { … }
此时其调用格式为: 可执行程序名 参数1 参数2 … 参数n
24
例8.16 设下列程序名为exam.c,经编译连接后生成的可执行程序为 exam.exe。请分析程序执行结果。
F O R T R A N \0
图8-10 命令行参数指针数组示意图T
26
课堂练习
写出下面程序的运行结果: 1. void fun(int *x) { printf("%d\n",++*x); } main() { int a=25;
6
例8.8 从键盘上输入5个整数到数组a中,然后输出。
main( ) { int a[5],i,*p;
p=a; for(i=0;i<5;i++) scanf("%d",p++); p=a; for(i=0;i<5;i++)
printf(“%6d”,*(p++)); /*不可(*p)++*/ printf("\n"); }
max=**a;
/*将第一个元素值赋给max*/
for(i=0;i<3;i++)
for(j=0;j<4;j++)
if(max<*(*(a+i)+j))
{ max=*(*(a+i)+j);m=i;n=j; }
printf("max is:a[%d][%d]=%d\n",m,n,max);
}
12
main( ) /*用指针法实现*/
21
例8.14 编写一个函数str_cat(),使串s2接到串s1后。
char *str_cat(char *s1,char *s2)
{ char *p;
for(p=s1;*p!=‘\0’;p++); /*此处使用了空循环*/
while(*s2!='\0') *p++=*s2++;
运行结果:
*p='\0'; return(s1); }
相关文档
最新文档