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

下载本文档

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

文档简介

C语言程序设计

—进阶篇第10章指针(1)2022/11/2内容概述1.指针变量的概念、特点、定义和使用方法。2.数组与指针的关系,包括一维数组和指针、二维数组和指针、字符串与指针等。3.指针变量作函数参数、指向数组的指针作函数的参数。2022/11/2教学目标1.掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。2.掌握指针变量的定义方法、赋值方法和指针运算符,熟练使用指针访问简单变量。3.熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。4.了解指针与字符串的关系,能熟练使用指针处理字符串。5.熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。2022/11/2第10章指针(1)C程序的变量所存放的数据:数值型数据:整数、实数通过前面的学习,我们已知道:字符型数据:字符、字符串结构型数据:数组、结构体、共用体2022/11/2

占有一定长度的内存单元如:intx;x占二字节、二个单元

每一个变量都有一个地址,为无符号整数,它不同于一般的整数。问题:能否对地址运算?能否用一个变量保存地址?这些变量具有的性质:2022/11/210.1基础知识10.1.1变量、地址、变量值1变量定义的含义:

在编译时,为变量分配适当大小的内存单元。2存储单元的地址:

给定的一个内存单元的字节偏移量(编号或地址)。内存中每个字节具有一个地址,用以区分不同的存储位置,它们是存储单元的名称.3存储单元内的内容:

某一个内存单元中存放的数据就是这个内存单元的内容。这些数据根据定义的变量的类型的不同,占用的内存的个数也不尽相同.(变量的值)2022/11/24.变量的“直接访问”方式:

按变量的地址(即变量名)存取变量值的方式。(见下图)i20003直接访问:2022/11/23i20002000pointer间接访问方式示意图:

将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取(见下图)。5.变量的“间接访问”方式2022/11/2内存用户数据区示意图(变量、地址、变量值之间的关系):变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向i。369.....2000...变量i变量j变量k变量pointer3010200020022004变量的值用10进制示意内存地址2022/11/2例如:若程序中定义了三个int变量i,j,k

inti=–5,j=5,k=10;设:系统分配i的起始地址为2000的单元则:

j的起始地址为为2002的单元k的起始地址为2004的单元2000200120022003200420053001–5+5102000ijk2022/11/2当程序中要用它们的值时:

y=i+j+k;则系统通过一张变量名与地址对应关系表:找到j的地址2002,

将2002,20003中的数据5读出;找到k的地址2004,

将2004,2005中的数据10读出。分别找到i的地址2000,

将2000,2001中的数据–5读出;然后把这些数据进行算术运算。2022/11/2直接访问:直接使用存放该数据的变量名。

间接访问:如果将某一变量的地址(如i的地址2000)存放到另一个变量x,则可通过x来存取i的值。上述过程称为变量的“直接访问”i相当于使用5使用变量2022/11/2如:用pi,pj,pk来存放i,j,k的地址20002002200455103001300330053007200020022004pipjpkijk若要得到变量i的值,可以先访问pi,得到i的地址,再通过该地址找到i的值。2022/11/210.1.3指针和指针变量1.什么是指针“指针”就是变量的地址,通过地址能够找到所需的变量单元。因此在C语言中,将地址形象化地称为“指针”。2.指针变量指针变量是一种用来存放某个变量的地址的特殊变量,指针变量存放了哪个变量的地址,则该指针变量就指向哪个变量。指针变量的类型是该指针变量所指向的变量的类型。例如:一个指针变量存放了某个整型变量的地址,则这个指针变量的类型就是整型。指针变量的名与一般变量名相同,都同标识符。指针变量只装地址(指针),在程序中的定义格式如下:

int*pointer1;*:指针变量定义符,声明pointer1是指针变量。

int:声明指针变量pointer1里面存放的是整型变量的地址。pointer1:指针变量名,里面存放一个整型数据的首地址。2022/11/210.1.4指针的概念3、指针的含义:

指针即变量的地址。(如2000、2001…2009等)4、指针变量:

含义:用于存放指针(地址)的变量。

定义方法:

数据类型*变量名

如:intx=3;

int*pointer1;

float*pointer2;

char*pointer3;20003pointer1*pointer1x20002022/11/23、指针变量使用要点: 指针变量定义格式: 数据类型*变量名

1)、数据类型:指针变量所指向目标单元的值的类型。

2)、*:指针变量的定义符

3)、变量名:目标变量在内存中的位置(表示一个地址),如:pointer1=&x;

4)、指针变量的初始化:将指针变量指向一个具体的变量,如:

int x=3;

int *pointer1=&x;

float *pointer2=&y;

char *pointer3=&z;2022/11/210.2指针变量的引用通过下列方法引用指针变量:.取地址运算符:&

.指针运算符:*

.指针的运算:算术、关系、赋值。

.指针变量作为函数的参数2022/11/210.2.1与指针相关的运算符1、&:取地址运算符:作用:用于变量名之前,表示该变量的存储地址。2、*:指针运算符(间接访问)

作用:用于指针变量名之前,获取该指针所指目标单元的值。

例如: main()

{ inta,b,*point1,*point2;

a=100;b=200; point1=&a;point2=&b;

printf(“%d,%d\n”,a,*point2); }2022/11/23、&和*两个运算符的优先级别是相同的,结合规律是右结合性:如: 若point1=&a;则 &*point1 等价于&a; *&a 等价于a; (*point1)++ 等价于a++;2022/11/2重要概念:

指针变量也有各种类型(如上面所示),但指针变量的值只能是整型值。指针变量的引用方式:

*变量名----表示所指变量的值。

变量名----表示指向变量的指针(地址)。若int*p;char*s;float*t;

*p=5;*s=a;*t=3.6;

2022/11/2存取指针变量所指向变量(目标变量)的值:

用指针运算符*,即:*p为i,&为同级运算符,结合性自右至左。则当&或&在一起时,具有抵消作用则:*p=&i相当于*p=i如上例:inti,p

i=3

p=&i若对指针变量进行取址运算,&p会有什么结果?请思考:2022/11/220002002地址jip=&i例:inti=1,j=2;int*p;p=&i;*p=10;printf(“%d”,*p);p=&j;printf(“%d”,*p);要点:·应随时了解指针变量的目标指向;·不允许直接对指针变量赋常量值。如:int*point;point=1000;()·只能给指针变量一个具有地址属性的值(数据或变量)。2022/11/210.2.2指针的运算1、算术运算

含义:对于地址的运算,只能进行整型数据的加、减运算。

2022/11/2200020022004地址kjip=&iinti,j,k;int*p=&i;(p=2000)p++;(p=2002)p++;(p=2004)p--;(p=2002)小结:·指针变量的算术运算结果是改变指针目标的指向;·指针变量算术运算的过程;p新=p原值+n*sizeof(类型)·提供指针的目的:使访问者与访问对象相隔离改进对成批数据的访问速度2022/11/2若有:float*t;

且:*t=3.6;

设t的地址为2000,则t+12004例:若有:int*p;

且:*p=5;

设p的地址为2000,则p+12002若有:char*s;

且:*s=a;

设s的地址为2000,则s+120012022/11/22、关系运算作用:用于识别目标变量在内存中的前后位置.用法:

inti,j;

int*p1=&i,*p2=&j;

而p1>p2用于判断或识别变量i,j在内存的排列顺序。2022/11/23、赋值运算作用:对指针变量的赋值运算,将改变指针变量的指向.2022/11/2例10.1:分析下面程序的功能.main(){ int*p1,*p2,*p,a,b;

scanf(“%d,%d”,&a,&b); p1=&a;p2=&b; if(a<b) {p=p1;p1=p2;p2=p;}

printf(“a=%d,b=%d\n”,a,b);

printf(“max=%d,min=%d\n”,*p1,*p2);}&a7&b8p2p1&b7&a8p2p1abbap2022/11/210.3指针变量作为函数参数1、含义:函数的参数不仅可以是基本数据类型,还可以是指针类型。2、功能:将一个变量的地址传送到另一个函数中。3、例5.2:分析下面的例子

swap(int*p1,int*p2)

{

intp;

p=*p1;

*p1=*p2;

*p2=p;

}main(){inta,b,*x,*y;

scanf(“%d,%d”,&a,&b);x=&a;y=&b;if(a<b)swap(x,y);

printf(“\n%d,%d\n”,a,b);}2022/11/2指针变量:(实参)指针变量:(形参)1020ab&ap1p2xy&b2022/11/2

程序中,实参与形参共用同一个内存单元,通过修改指针(地址)所指的值来交换数据:2010ab&ap1p2xy&b指针变量:(实参)指针变量:(形参)2022/11/2(1)注意函数中p为普通变量,并非地址量;(2)如果swap函数中的交换语句改为:

int

p1,p2,p;p=p1;p1=p2;p2=p;

则仅将p1,p2的指向改变,函数返回后,p1,p2释放,a、b中的内容依然未改变。2022/11/2调用函数时:&bxy&a实参1020abp1p2形参2022/11/2

swap(intp1,intp2) { intp; p=p1; p1=p2; p2=p; }(3)不用地址量作参数,不能实现交换,即:2022/11/2结论:1)指针变量作为参数,从调用函数到被调用函数传递的不是一个变量而是变量的地址;2)指针变量作为函数的参数,从实参到形参的数据传递仍然遵循“单向值传递”的原则,只是此时传递的是地址。3)通过函数的调用可以得到n个需改变值的方法:

用指针变量;

用数组名;

用全局变量;2022/11/24、示例:例5.3:分析下面的程序

swap(int*p1,int*p2)

{ intp;

p=*p1;

*p1=*p2;

*p2=p;

}

main()

{ inta,b;

scanf(“%d,%d”,&a,&b);

if(a<b) swap(&a,&b);

printf(“\n%d,%d\n”,a,b);}2022/11/2例10.4:分析下面的程序写出结果

swap(int*a,int*b)

{ int*t;

t=a;a=b;b=t;

printf(“%d,%d\n”,*a,*b);}

main()

{

inta=3,b=5;

swap(&a,&b);

printf(“%d,%d\n”,a,b);}

a,b的值没有改变。在调用函数时改变指针的指向。运行结果:5,3

3,52022/11/2例10.5:分析下面的程序写出结果

swap(int

a,intb)

{

intt;

t=a;a=b;b=t;

printf(“%d,%d\n”,a,b); }

main()

{

inta=3,b=5;

swap(a,b);

printf(“%d,%d\n”,a,b);

}

运行结果:5,3

3,52022/11/2

例10.6:分析下面的程序写出结果

swap(int*a,int*b)

{

intt;

t=*a;*a=*b;*b=t;

printf(“%d,%d\n”,*a,*b); }

main()

{

inta=3,b=5;

swap(&a,&b);

printf(“%d,%d\n”,a,b);

}

运行结果:5,3

5,32022/11/2例10.7:输入a、b、c三个整数,按大小顺序输出。swap(int*a,int*b){intt;t=*a,*a=*b,*b=t;}main(){inta,b,c,*p1,*p2,*p3;

scanf(“%d,%d,%d”,&a,&b,&c);运行情况:

p1=&a,p2=&b,p3=&c;输入:9,0,10

exchange(p1,p2,p3);输出:10,9,0

printf(“%d,%d,%d\n”,a,b,c);}exchange(q1,q2,q3)int*q1,*q2,*q3;{if(*q1<*q2)swap(q1,q2);if(*q1<*q3)swap(q1,q3);if(*q2<*q3)swap(q2,q3);}2022/11/2例10.7B:/*----ch05_5b.c----*/#include<stdio.h>main(){intal=123,a2=234,a3=345;

int*pl,*p2,*p3;

intas[3]={1,2,3},*ps[3];pl=&a1;p2=p1+1;p3=p2+1;printf("p1=%ld\np2=%ld\np3=%ld\n",p1,p2,p3);

printf("*p1=%ld\n*p2=%ld\n*p3=%ld\n",*p1,*p2,*p3);2022/11/2

printf("ps[0]=%ld\nps[1]=%ld\nps[2]=%ld\n",ps[0],ps[1],ps[2]);

printf("*ps[0]=%ld\n*ps[1]=%ld\n*ps[2]=%ld\n",*ps[0],*ps[1],*ps[2]);}ps[0]=&as[0];ps[1]=ps[0]+1;ps[2]=ps[1]+1;2022/11/2运行结果:p1=262737918p2=262737920p3=262737922*p1=123*p2=0*p3=320ps[0]=262737896ps[1]=262737898ps[2]=262737900*ps[0]=1*ps[1]=2*p2[2]=3地址a1的值系统给定的值数组元素地址数组元素的值2022/11/2注意:指针变量在未赋值前指向一个不定值例:#include<stdio.h>main(){ int*p;

printf("*p=%d,p=%ld",*p,p);}运行结果:*p=0,p=38422022/11/210.4数组的指针和指向数组的指针变量10.4.1概念1、数组的指针:

数组的起始地址(即数组名)。是一个恒定值指针。2、数组元素的指针:

数组元素的地址。3、指向数组的指针变量:

用于存放数组的起始地址或某一数组元素地址的变量。2022/11/210.4.2定义方法1、定义方法 与一般指针变量的定义方法相同。如:

inta[10],*p1,*p2;

p1=a;

p2=&a[2];注:p1为指向数组的指针

p2为指向数组元素的指针a[0]aa[1]a[2]a[9]p1=aa[i]p2C语言规定:数组a的首地址即用&a[0]表示,亦可用a表示

所以:p=&a[0];和p=a等价2、在定义指针变量时可以直接赋初值

如:

inta[10],*p1=a,*p2=&a[0];2022/11/210.4.3利用指针访问数组的几种方法1、作用

引用数组元素可以用下标法,还可以用指针法。使用指针方法能使目标程序的质量高̖占内存少、运行速度快。2、基本方法 1)将指针指向数组中的某个元素;

2)利用*(p+n)获得数组元素的值。

如:

inta[9]={0,1,2,3};

int*p=a;

printf(“%d”,*p);

printf(“%d”,*(p++));

printf(“%d”,*(p++));a[0]*(p+n-1)aa[1]a[2]a[n-1]p++p++p=aa[i]p+i或a+ip+n-1*(p+i)或p[i]2022/11/2例10.8:输出数组的全部元素。方法一:下标法main(){inta[10];

inti;for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“\n”);for(i=0;i<10;i++)

printf(“%d,”,a[i]);}方法二:地址法main(){inta[10];

inti;for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“\n”);for(i=0;i<10;i++)

printf(“%d,”,*(a+i));}2022/11/2例10.8:输出数组的全部元素。方法三:指针法main(){inta[10];

int*p,i;for(i=0;i<10;i++)

scanf(“%d”,&a[i]);

printf(“\n”);for(p=a;p<a+10;p++)

printf(“%d,”,*p);}三种方法的比较:方法1与方法2的执行效率相同,都是先计算数组元素的地址,再访问数组元素的值,费时。方法3利用指针变量直接访问数组元素的值,不必计算数组元素的地址,故执行效率高。下标法直观,指针法与地址法不够直观。2022/11/2例10.9:下面的程序的输出结果是什么?#include<stdio.h>inta[]={2,4,6,8},b[4];main(){

inti,*p=a; for(i=0;i<4;i++)

b[i]=*p++; printf(“%d\n”,b[2]);}运行结果为:62022/11/23.综上所述,引用一个数组元素有两种方法:(1)下标法:如a[i]形式;(2)指针法:如*(a+i)或*(p+i)。关于用指针方法引用数组元素,是一个重点,也是一个难点,为了方便大家理解,特制表格,见下页。2022/11/2若有数组及指针定义inta[5],*p=a;下标法:

a[0]a[1]a[2]a[3]a[4]指针法:*p*(p+1)*(p+2)*(p+3)*(p+4)*a*(a+1)*(a+2)*(a+3)*(a+4)各元素地址pp+1p+2p+3p+4aa+1a+2a+3a+4

&a&a[1]&a[2]&a[3]&a[4]2022/11/2例如有定义:inta[10],*p;p=a;p++合法;但a++不合法(a是数组名,代表数组首地址,是常数地址,常量不能作赋值运算。)要注意指针变量的当前值。

p=a;/*注意此句*/for(i=0;i<10;i++,p++)

printf("%d",*p);}4.注意事项main(){int*p,i,a[10];p=a;for(i=0;i<10;i++)

scanf("%d",p++);2022/11/2注意指针变量的有关运算以下结论都在使指针指向数组a,即在p=a;前提下得出p++;(或p+=1;)p将指向下一元素,即a[1]。x=*p++:*与++是同级运算符(结合方向自右向左),等价于先计算*p,为x赋值a[0];p再自增1,新的p指向a[1]。2022/11/2(*p)++;

表示p所指向的元素值加1(即a[0]++),而不是指针值p加1。

*(p++)与*(++p):*(p++)是先取*p的值,后使p加1;*(++p)是先使p加1,后取*p的值。2022/11/2课堂练习1:main(){

inta[3],*p=a; a[0]=10;a[1]=20;a[2]=30;

printf(“%d\n”,*p++);/*输出p后p指向a[1]*/

printf(“%d\n”,*++p);/*输出p前p指向a[2]*/}1030答案:2022/11/2main(){

inta[]={1,2,3,4,5};

int*p=a+3;/*p指向a[3]*/

printf(“%d,%d,%d\n”,*p,*(p+1),*p+3);}/**p+3相当于a[3]+3等价于(*p)+3*/4,5,7课堂练习2:结果:2022/11/2*例10.10:下面的程序的输出结果是什么?main(){ inta[10];

int*p,i; p=a; for(i=0;i<10;i++)

scanf(“%d”,p++);

printf(“\n”);for(i=0;i<10;i++,p++)

printf(“%d”,*p);}2022/11/210.5数组名作函数的参数1、数组元素作函数的参数。

2、数组名作为函数的参数

实参与形参操作的是内存中的同一段地址单元,这样在被调用函数中对数组元素的内容的改变将会反映到调用函数中。(即地址传递或双向传递)2022/11/23、数组作函数的参数时,实参与形参还可用指针的形式给出:(同样是地址传递) 用数组名与数组的指针组合形式可以是:

实参数组名数组名指针指针形参数组名指针数组名指针2022/11/2例10.11:将数组a中的n个整数按相反的顺序存放。

voidinv(int*x,intn)/*形参,实参都用指针变量*/{

int*p,m,t,*i,*j;

m=(n-1)/2;

i=x;/*将a数组的首地址赋给指针变量i*/j=x+n-1;/*将&a[9]—第10个元素的地址赋给指针变量j*/p=x+m;/*将&a[4]的地址赋给指针变量p作为地址运算上界*/

for(;i<=p;i++,j--)/*用地址变化交换数组元素值*/ {t=*i;*i=*j;*j=t;}

}

main()

{ staticinta[10]={3,7,9,11,0,6,7,5,4,2};

inti,*p; p=a; inv(p,10);

for(p=a;p<a+10;p++)/*用地址变化输出数组元素值*/

printf(“%d”,*p);

printf(“\n”); }2022/11/2例10.12:下面程序的输出结果是:#defineMAX 3/*形参用数组名,实参用指针变量*/int

a[MAX];/*定义数组a为全局变量*/fun1(){

intk,t=0;

for(k=0;k<MAX;k++,t++)a[k]=t+t;

returna;}/*a[0]=0,a[1]=2,a[2]=4*/fun2(intb[]){ intk; for(k=0;k<MAX;k++)

printf(“%d”,*(b+k));/*通过改变地址输出数组元素值*/}main(){int*p; p=fun1(); fun2(p);/*将数组a的首地址作为实参传给形参数组b*/

printf(“\n”);}

运行结果为:024

2022/11/2例10.13:分析以下程序的输出结果。

voidsort(int

data[],intn)/*形参,实参都用数组名*/{

inti,j,t;

for(i=0;i<n;i++)

for(j=i+1;j<n;j++)

if(data[i]<data[j])

{t=data[i];data[i]=data[j];data[j]=t;} }

main()

{

intarray[5]={2,8,7,5,9};

inti;

sort(array,3);/*将实参数组array的首地址传给形参data数组*/

for(i=0;i<5;i++)

printf(“%d”,array[i]);printf(“\n”);}

运行结果为:87259

2022/11/2例10.14:分析程序写出结果.

#include<stdio.h>

voidfun(int*s)/*实参用数组名,形参用指针变量*/{ staticintj=0;

do{

s[j]+=s[j+1]; }while(++j<2); }

main()

{

intk,a[10]={1,2,3,4,5};

for(k=1;k<3;k++) fun(a);

for(k=0;k<5;k++)

printf(“%d”,a[k]);

}运行结果为:357452022/11/210.6字符串的指针和指向字符串的指针变量10.6.1用字符数组实现字符串处理

main()

{ staticcharstr[]=“Iamastudent.”;

puts(str); }说明: str是数组名,代表数组的首地址,

str[i]代表数组的第i个元素,

str[i]等价于*(str+i)。2022/11/210.6.2用字符指针实现字符串处理main(){ char*str=“Iamastudent.”;

puts(str);}这里的str就是字符指针。2022/11/2要点:1、字符串指针可以用来描述一个字符串。

方法:char*str=“Iamastudent.”;2、意义 不是将字符串的内容赋值给指针变量,而是将其起始地址赋给它。

char*str;

str=“Iamastudent.”;2022/11/23、应用:利用字符串的指针变量对字符串进行输入与输出。 puts(),gets()

scanf(),printf()的%s输出格式。例10.15:分析下面的程序main(){ chararr[]=“ABCDE”;

char*ptr;

for(ptr=arr;ptr<arr+5;ptr++)

printf(“%s\n”,ptr);}运行结果为: ABCDE

BCDE

CDE

DE

E2022/11/2例10.16:有以下的程序,输出结果为:main(){ char*p1=“programming”,*p2=“language”;

inti;

for(i=0;i<=7;i++)

if(*(p1+i)==*(p2+i))

printf(“%c”,*(p1+i));}结果:ga2022/11/210.6.3字符串指针作函数的参数1.用字符数组作函数的参数例10.17:分析以下程序fun(chars[]){ intx,y;

charc;

y=strlen(s)-1;

for(x=0;x<y;x++,y--)

{c=s[y];s[y]=s[x];s[x]=c;}}main(){chara[]=“abcdefghi“fun(a);puts(a);}运行结果为:ihgfedcba2022/11/22.用字符指针作函数的参数例10.18:分析以下的程序fun(char*s){

intx,y;

charc;

for(x=0,y=strlen(s)-1;x<y;x++,y--)

{ c=s[y];s[y]=s[x];s[x]=c;}}main(){ char*p,a[]=“abcdefghi”;p=a;

fun(p);

puts(p);}2022/11/23字符指针与字符数组的区别1).字符数组由若干个元素组成,每个元素存放一个字符,而字符指针存放的是地址(当处理字符串时存放的是字符串的地址);2).赋初值方式不同;

chara[]=“Iamastudent.”;

char*str=“IloveChina.”;3).赋值方式不同;

(1)对于字符数组赋值不能使用以下的方法:

charstr[10];

str=“book”;

(2)对于字符类型的指针变量可以使用以下的方法:

char*str;

str=“Thisisabook.”;2022/11/24)字符指针变量在使用之前必须初始化,即使其指向一个具体的存储单元。如:

charstr[];

scanf(“%s”,str);是正确的

而char*str;

scanf(“%s”,str);将是错误的。5)指向字符类型的指针变量可以用指针的形式表示,也可以用下标的形式表示。2022/11/2

例10.19:分析以下程序main(){ char*str=“Iamastudent.”;

str=str+7;

printf(“%s\n”,str);

for(;*str;str++) /*可改为while(*str)*/

printf(“%c”,*str);

printf(“\n”);

}运行结果:student.student.2022/11/2例10.20:分析以下的程序

main()

{ char*str=“Iamastudent.”;

inti;

str=str+7;/*首地址为str[7]*/

printf(“%s\n”,str);

for(i=0;i<7;i++)

printf(“%c”,str[i]));/*从str[7]开始输出*/

printf(“\n”);

}结果:student.student2022/11/2C语言程序设计综合练习7*1.用指针变量编程序,将100赋给变量a,并输出a的值。2022/11/2C语言程序设计综合练习71.#include<stdio.h>main(){

inta,*p; p=&a; *p=100;

printf("a=%d\n",a);}2022/11/2C语言程序设计综合练习7$2.用指针变量编程序,将字符串“CProgrammingLanguage”的首地址赋给指针变量,然后输出整个字符串和字符串的第一个字符。2022/11/2C语言程序设计综合练习72.#include<stdio.h>main(){ char*p; p="CProgrammingLanguage";

printf("p=%s\n",p);

printf("%c\n",*p);}2022/11/2C语言程序设计综合练习7*3.设a=5,b=10,用指针变量编程序,通过调用函数交换两个变量的值。2022/11/2C语言程序设计综合练习73.#include<stdio.h>main(){int

swap(int*x,int*y);

int

a,b; a=5,b=10;

swap(&a,&b);

printf("newa=%dnewb=%d\n",a,b);}

int

swap(int*x,int*y){

intt; t=*x; *x=*y; *y=t;}2022/11/2C语言程序设计综合练习7$4.编程序,删除从键盘输入的字符串中的所有数字字符(用宏命令定义数组长度)。例如:#defineN30

cahar

a[N],b[N];上课需要讲解字符串中有空格需要用gets()函数输入。2022/11/2C语言程序设计综合练习74.#include<stdio.h>#defineN30voidfun(char

a[],charb[]);main(){chara[N],b[N];

printf("Input

astring:");

gets(a);/*scanf("%s",a);*/

fun(a,b);

printf("%s\n",b);}voidfun(char

a[],charb[]){inti=0,j=0;while(a[i]!='\0'){if(a[i]<'\0'||a[i]>'9'){b[j]=a[i];j++;}i++;}b[j]='\0';}2022/11/2C语言程序设计综合练习7*5.编程序(用指针变量),计算一个自然数的各位数字之和与各位数字的平方和。2022/11/2C语言程序设计综合练习75.#include<stdio.h>voidfun(long

s,int*a,int*b);main(){longx;int

a,b;

printf("Inputalongintegernumberx:");

scanf("%ld",&x);

fun(x,&a,&b);

printf("Thesumofeverydigitis:%d\n",a);

printf("Thesumofeverydigit'ssquareis:%d\n",b);}voidfun(long

s,int*a,int*b) {intm; *a=0;*b=0;

while(s) {m=s%10; *a=*a+m; *b=*b+m*m; s=s/10; } }2022/11/2C语言程序设计综合练习7*6.编程序(用指针变量),计算m的倒数和n的倒数的和与差。2022/11/2C语言程序设计综合练习76.#include<stdio.h>voidfun(int

m,int

n,float*x,float*y); main(){int

m,n;floatx,y;

printf("Inputtwonumberm(!=0)&&n(!=0):\t");

scanf("%d%d",&m,&n);

fun(m,n,&x,&y);printf("1/%d+1/%d=%f\n",m,n,x);printf("1/%d-1/%d=%f\n",m,n,y);}voidfun(int

m,int

n,float*x,float*y){floata,b;a=1.0/m;b=1.0/n; *x=a+b;*y=a-b; }2022/11/2C语言程序设计综合练习77.编程序,计算100以内含6的所有自然数的倒数之和。2022/11/2C语言程序设计综合练习77.#include<stdio.h>floatfun(){inti;floatsum=0.0;

for(i=1;i<100;i++) if(i/10==6||i%10==6) sum=sum+1.0/i;

returensum;} floatmain() {floatc; c=fun();

printf("%f\n",c); }2022/11/2C语言程序设计综合练习78.编程序,计算如下公式:

2022/11/2C语言程序设计综合练习78.#include<stdio.h>floatfun(int

s,floatx);main(){int

n;float

x,sum;

printf("Inputaintegernumbern:\t");

scanf("%d",&n);

printf("Input

x:\t");

scanf("%f",&x);sum=fun(n,x);

printf("Theresultis:%f\n",sum);}floatfun(int

n,floatx){int

i;floatu=0,y=1,sum=1;

for(i=1;i<=n;i++) u=u+i;y=y*x;sum=sum+y/u;

return(sum);}2022/11/2C语言程序设计综合练习7*9.编程序,判断从键盘输入的两个double型数据(非0)是否具有相同的符号。要求:所有操作必须通过指针实现。上课需要讲解double型数据用%lf或%e格式输入。2022/11/2C语言程序设计综合练习79.#include<stdio.h>main(){doublea,b,*pa=&a,*pb=&b;printf("请输入两个double型数据a和b:");scanf("%lf%lf",pa,pb);if(*pa**pb>0)printf("变量a和b同号!\n");elseprintf("变量a和b不同号!\n");}2022/11/2C语言程序设计综合练习7*10.编程序,用移动指针的方法将用户从键盘输入的若干字符(用’0’结束输入)存放在数组W中,找出数组中具有最大ASCII码值的字符,输出该字符及其ASCII码。要求:程序中所有操作(输入̖查找及输出)

温馨提示

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

评论

0/150

提交评论