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

下载本文档

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

文档简介

C语言程序设计

—进阶篇第8章指针2022/11/2内容概述1.指针变量的概念、特点、定义和使用方法。2.数组与指针的关系,包括一维数组和指针、字符串与指针等。3.指针变量作函数参数、指向数组的指针作函数的参数。2022/11/2教学目标1.掌握指针和指针变量的概念,了解指针变量的特点以及直接访问数据和间接访问数据的原理。2.掌握指针变量的定义、赋值方法及指针运算符的使用,熟练运用指针访问简单变量。3.熟悉指针和一维数组的关系,掌握指向一维数组的指针变量的定义方法,熟练使用指针变量访问一维数组元素。4.了解指针与字符串的关系,能熟练使用指针处理字符串。5.熟练掌握用指针变量作函数的参数时函数的定义和调用方法、数组名作函数的参数用法。2022/11/2C语言中,变量是有类型的,而且占据一定长度的内存单元。

通过前面的学习,我们已知道:例如:

charch;变量ch占用1个字节的存储单元

intn;变量n占用4个字节的存储单元

floatx;变量x占用4个字节的存储单元doublef;变量f占用8个字节的存储单元

2022/11/2

既然变量占据一定的内存空间,那么每一个变量都对应一个内存地址,这个地址为无符号整数,它不同于一般的整数。问题:能否对地址运算?能否用一个变量保存地址?2022/11/28.1指针类型

8.1.1变量的地址和变量的值1变量的值:

变量所占据的存储单元中的内容是变量的值。在程序中通过变量名就可以存取这个变量所对应的存储单元的内容,即存取变量的值。

2变量的地址:

在编译时,为变量分配适当大小的内存单元。我们把变量所占用的存储单元首字节的地址作为变量的地址。

C语言中利用取地址运算符“&”获取变量的存储地址。例如,&c将返回c的首地址;&x将返回x的首地址。

2022/11/21.变量的“直接访问”方式:

按变量名(即变量的地址)存取变量值的方式。i20003直接访问:8.1.2变量的直接访问和间接访问

2022/11/22000

2004

2008

30013582000ijk例如:若程序中定义了三个int变量i,j,k

inti=3,j=5,k=8;设:系统为变量分配的地址如下:i的起始地址为2000的单元;j的起始地址为2004的单元;k的起始地址为2008的单元。2022/11/2当程序中要用它们的值时:

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

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

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

将2000~2003中的数据3读出;

把这些数据进行算术运算。该过程称为变量的“直接访问”2022/11/2

将变量的地址放在另一个内存单元中,先到另一个内存单元中取得变量的地址,再由变量的地址找到变量并进行数据存取。2.变量的“间接访问”方式3i20002000pointer间接访问方式示意图:2022/11/2

将某一变量i的地址2000存放到另一个变量pointer中,则可通过pointer来存取i的值。我们称对变量i的“间接访问”。

变量pointer为指针变量,存放的是变量i的内存地址,我们说pointer指向i。

这里,给变量的地址一个特殊的名称,这就是“指针”。存放指针的变量就是指针变量,即指针变量是一个特殊的变量,它是专门用来存放另一变量的地址的。

2022/11/2如:用pi,pj,pk来存放i,j,k的地址200020042008358300130053009200020042008pipjpkijk若要得到变量i,j,k的值,可以先访问pi,pj,pk,得到i,j,k的地址,再通过得到的地址找到它们的值。该过程是变量的“间接访问”2022/11/28.1.3指针变量的定义

指针的含义:

指针即变量的地址。(如2000、2004、2008等)指针变量:

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

定义方法:

数据类型*指针变量名

数据类型*指针变量名=变量地址其中1)、数据类型:指针变量所指向目标单元的值的类型。

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

3)、变量名:目标变量在内存中的位置(地址)2022/11/230003.5p1*p1x300020003p*pi20004)、指针变量的初始化:将指针变量指向一个具体的变量,如:

int i=3;

int *p=&i;

floatx=3.5;

float*p1=&x;2022/11/28.1.4指针变量的引用1

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

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

(3)、&和*两个运算符的优先级别是相同的,结合规律是右结合性:如: 若p=&x;则 &*p 等价于&x; *&x 等价于x; (*p)++ 等价于x++;2022/11/22.指针变量的引用方式:

指针变量的引用包括两个方面:引用指针变量本身和引用指针所指的变量。*变量名----表示所指变量的值。

变量名----表示指向变量的指针(地址)。例如,定义和语句如下:

inti=10;

int*p,*p1;…p=&i;*p=30p1=p;p表示指针部分,属于指针类型,其内容为变量i的存储地址;*p表示指针所指的变量部分,属于int类型。2022/11/2同样,在程序中对指针变量的操作也分为两个部分:对指针部分的操作

例如:p1=p;对指针所指变量的操作

例如:*p=30;需要注意的是:“*”操作符在指针上的两种用途要区分开:定义或声明时,建立一个指针;执行时间接引用一个指针。定义指针间接引用一个指针例如:intx,*p;p=&x;*p=20;2022/11/2重要概念:

指针变量也有各种类型,但指针变量的值只能是整型值。point=&x;(√)不允许直接对指针变量赋常量值。如:

int*point;point=1000;()只能给指针变量一个具有地址属性的值。如:

intx,*point;2022/11/2【例8.1】演示使用指针及指针地址。〖程序代码〗#include<stdio.h>voidmain(){

intx=100;

int*p;p=&x;

printf("x=%-10d*p=%d\n",x,*p);

printf("&x=%-10up=%u\n",&x,p);

printf("&p=%u\n",&p);}若对指针变量进行取址运算,&p会有什么结果?请思考:2022/11/28.1.5空指针和void型指针void型指针是仅指向内存的某个地址,而该地址所存储的数据对象的类型尚未确定,因此,void型指针也叫无指定类型指针,在将它的值赋给另一变量时要进行强制类型转换。

C语言的标准头文件stdio.h中定义了一个常量NULL,称为空指针,它的代码值为0。并规定:所有指针变量,不论其基类型为何种类型,均可置为空指针,空指针不指向任何可访问的存储单元。例如:

int*p;void*q;…

p=(int*)q;2022/11/28.2指针运算8.2.1赋值运算1.指针变量的初始化赋值指针变量在使用前必须赋初值。可以在定义指针变量的同时对其进行初始化赋值:

intx,*p=&x;也可以在程序执行时对其进行初始化赋值:

intx,*p;p=&x;2022/11/2注意:在没赋初值之前,指针变量的内容将是不确定的,即指针没有确定的指向。如果此时引用指针指向的变量,将会产生不可预料的后果。例如,int*ptr;*ptr=100;

×一定要注意哦!2022/11/22.指针变量间的赋值在C程序中,可以将一个指针赋给另一个基类型相同的指针,其含义是两个指针在同一时刻指向同一个变量。例如:inta,b,*p=&a,*p1=&b;…p1=p;改变了p1的指向2022/11/2【例8.2】演示指针变量赋值的例子。#include<stdio.h>main(){

inta=100,b=200;

int*pa=&a,*pb=&b;/*定义指针变量并赋初值*/*pa=*pb;/*指针所指变量的赋值*/

printf("*pa=%d,*pb=%d\n",*pa,*pb);b=300;pa=pb;/*指针变量赋值*/

printf("*pa=%d,*pb=%d\n",*pa,*pb);}2022/11/2课堂练习:分析下面程序的功能.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/28.2.2指针的加减运算含义:对于地址的运算,只能进行整型数据的加、减运算。规则:指针变量+n意味着将指针指向的当前变量向前或后的第n个变量单元。指针变量算术运算的过程;p新=p原值+n*sizeof(类型)2022/11/220022004p(a)P指向2000单元201220022004p20082016(c)执行p=p+3之后200220042008p(b)执行p++之后20082002200420122016p(d)执行p--之后假设有定义“int*p;”,且已知p指向2000单元,则顺序执行“p++;p=p+3;p--;”之后指针的指向如下图所示。

指针变量的算术运算结果是改变指针目标的指向;2022/11/28.2.3指针的比较作用:

用于识别目标变量在内存中的前后位置.(1)若p和q是指向同一数组的指针,那么,p==q表示p和q指向同一元素;p>q表示p处于高地址位置;p<q表示p处于低地址位置。(2)不同类型指针之间或指针与一般的整型数据之间的比较是没有意义的。2022/11/28.3指针变量作为函数参数

函数的参数不仅可以是基本数据类型,还可以是指针类型。指针做函数参数的实质是将一个变量的地址传送到另一个函数中。相对于值传递方式,这是一种地址传递方式。2022/11/28.3.1在函数中处理主调函数中的变量【例8.3】调用函数swap()实现两个整型量的内容交换。

swap(int*p1,int*p2)

{

inttemp;

temp=*p1;

*p1=*p2;

*p2=temp;

}2022/11/2main(){inta=25,b=48;

printf("beforeswapping:");

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

swap(&a,&b);

printf("afterswapping:");

printf("a=%d,b=%d\n",a,b);}2022/11/2地址传递内存布局

swapmainytempbxa交换48&b返回地址&a25

程序中,形参通过修改地址所指的值来交换数据:2022/11/2(1)注意函数中temp为普通变量,并非地址量;(2)不用地址量作参数,不能实现交换,即:

swap(intx,inty) { inttemp; temp=x; x=y; y=temp; }

2022/11/2swapmainytempbxa交换4848返回地址2525栈值传递内存布局

仅将形参x和y的内容交换,函数返回后,形参x、y释放,实参a、b中的内容依然未改变。2022/11/2下面的swap函数,虽然用指针做函数参数,也不能达到交换的目的。

swap(int*x,int*y)

{ int*temp; temp=x; x=y;

y=temp; }

2022/11/2

仅将x、y的指向改变,函数返回后,x、y释放,a、b中的内容依然未改变。swapmainytempbxa交换48&b返回地址&a25形参指针变量交换示意2022/11/2如果写成这样就有问题了:voidswap(int*x,int*y){

int*temp;*temp=*x;*x=*y;*y=*temp;}*temp是指针变量temp所指向的变量,而指针变量temp没有初始赋值,内部是一个随机地址,这种赋值是很危险的,有可能造成系统瘫痪。2022/11/2结论:1)指针变量作为参数,从调用函数到被调用函数传递的不是一个变量而是变量的地址;2)指针变量作为函数的参数,从实参到形参的数据传递仍然遵循“单向值传递”的原则,只是此时传递的是地址。3)通过函数的调用可以得到n个需改变值的方法:

用指针变量;

用数组名;

用全局变量;2022/11/28.3.2利用指针将函数处理结果带回主调函数【例8.4】编写函数求n!,并在主函数中调用它。#include"stdio.h"voidfac(int

n,long*s){inti;*s=1;

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

(*s)*=i;

/**s内存储n!*/}main(){intn;longm;

scanf("%d",&n);

fac(n,&m);

/*调用函数fac(),求n!,结果存入m中*/

printf("%d!=%ld\n",n,m);}2022/11/2综上所述,指针变量作为函数参数的作用有两个:

指针变量作为函数参数可以对主调函数中的变量进行操作,用起来非常灵活。但也要看到,指针的灵活性是以破坏函数的黑盒为代价的。它使函数可以访问本函数栈空间以外的内存区域,以至于使得程序可读性差,跟踪错误的区域从函数的局部栈空间扩大到整个内存空间,增加了调试的复杂性。在函数中处理主调函数中的变量;将函数处理结果带回主调函数。2022/11/28.4用指针访问一维数组

8.4.1指针与数组的关系

1、数组的指针:

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

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

用于存放数组的起始地址或某一数组元素地址的变量。2022/11/28.4.2指向数组的指针变量的定义1、定义方法

具体定义方法与一般指针变量的定义方法相同。例如:

inta[10];

int*p;C语言规定:数组a的首地址即可用&a[0]表示,亦可用a表示。所以:p=&a[0];和p=a;等价,都表示把数组a的首地址赋给指针变量p

2、对指针变量p可进行初始化赋值。

例如:inta[10];

int*p=a;或int*p=&a[0];a[0]aa[1]a[2]a[9]pa[i]p+1p+2p+ip+92022/11/28.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

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

scanf("%d",&a[i]);for(p=a,i=0;i<10;i++)

scanf("%d",p+i);for(p=a;p<a+10;p++)

scanf("%d",p);

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

scanf("%d",&p[i]);

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

scanf("%d",a+i);可以用以下方法输入数组a的内容。方法一:方法二:方法三:方法四:方法五:2022/11/2可以用以下方法输出数组a的内容。方法一:

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

printf("%d",a[i]);方法二:

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

printf("%d",*(a+i));方法三:

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

printf("%d",p[i]);方法四:

for(p=a;p<a+10;p++)

printf("%d",*p);方法五:

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

printf("%d",*(p+i));2022/11/2下面这段程序能输出数组a的10个元素值吗?

main(){

inti,a[10],*p=a;

for(;p<a+10;p++)

scanf("%d",p);

for(;p<a+10;p++)

printf("%d",*p);}2022/11/2练习:下面的程序的输出结果是什么?#include<stdio.h>inta[]={2,4,6,8};main(){

inti,*p=a; for(i=0;i<4;i++) a[i]=*p++; printf(“%d\n”,a[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+4

aa+1a+2a+3a+4

&a&a[1]&a[2]&a[3]&a[4]2022/11/2

尽管指针变量与数组名都保留着数组的存储地址,但它们却有着本质的区别。数组名是指针常量,它本身并不占用存储空间,一旦定义不允许更改;而指针变量的内容可以随时更改。

例如有定义:

inta[10],*p;p=a;

则:p++合法;但a++不合法4.注意事项2022/11/25.指针变量的有关运算

x=*p++:*与++是同级运算,等价于先计算*p,为x赋值a[0];p再自增1,新的p指向a[1]。假设:inta[10],*p;p=a;

p++;(或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++);

printf(“%d\n”,*++p);}答案:

10302022/11/2main(){

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

int*p=a+3;

printf(“%d,%d,%d\n”,*p,*(p+1),*p+3);}结果:4,5,7课堂练习2:2022/11/2【例8.5】将数组a中的n个整数按相反的顺序存放。〖程序分析〗将数组a中的n个整数逆序存放,即将数组a中的n个元素对换,a[0]与a[n-1]对换,a[1]与a[n-2]对换,……,直到将a[int(n-1)/2]与a[n-int((n-1)/2)-1]对换。我们可以定义两个指针变量p和q,分别指向数组的第一个元素和最后一个元素,交换*p和*q的值,然后p++,q--,重复该过程,直至执行(N-1)/2+1次。2022/11/2#defineN10#include"stdio.h"voidmain(){intt,i,a[10];

int*p=a,*q=a+9,m;

printf("Input10numbers:\n");

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

scanf("%d",p+i);m=(N-1)/2;

for(;p<=a+m;p++,q--){t=*p; *p=*q; *q=t;}p=a;

printf("Thearrayhasbeenreverted:\n");

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

printf("%d",*(p+i));

printf("\n"); }2022/11/28.4.4动态申请存储空间在C语言的库函数中提供了一对标准函数malloc()和free(),用于在需要的时候申请或释放内存空间,它们的原型被声明在stdlib.h中。内存申请库函数malloc()

调用格式如下:

void*malloc(size)

作用:该函数在内存的动态存储区分配一个长度为size的连续存储空间。

返回值:若申请成功,则返回新分配内存块的起始地址,否则返回NULL。2022/11/2内存释放库函数free()

调用格式如下:

voidfree(ptr)

作用:voidfree(ptr)

返回值:无

malloc()函数的返回值是一个void型指针,必须将其返回值强制转换成被赋值指针变量的数据类型。例如:

ptr=(int*)malloc(10*sizeof(int));……

free(ptr);2022/11/2【例8.6】编制程序利用动态内存分配存放n个整型数的一维数组,n的值在程序运行过程中指定,然后从键盘输入任意n个整数存入该数组中,并计算其各元素之和。〖程序分析〗

该程序可以从键盘输入n的值,然后调用malloc()函数动态建立一个由n个整型数构成的一维数组,申请空间大小为n*sizeof(int)。对于这样得到的一维数组存储空间,既可以采用指针法引用每个元素,也可以采用下标法对每个元素进行操作。2022/11/2#include"stdlib.h"#include"stdio.h"main(){int*p,i,n,s=0;

printf("Enterthedimensionofarray:");

scanf("%d",&n);

if((p=(int*)malloc(n*sizeof(int)))==NULL){

printf("Mallocmemoryfailer!");exit(0);}

printf("Enter%dvaluesofarray:\n",n);

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

scanf("%d",p+i);s+=*(p+i);}

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

free(p);}2022/11/28.5数组名作函数的参数

1、数组元素作函数的参数。值传递方式。2、数组名作为函数的参数

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

实参数组名数组名指针指针形参数组名指针数组名指针2022/11/2【例8.7】编写函数,实现将数组a中的n个整数逆序存放。

定义函数“voidinv(int

x[],intn)”实现将数组x中的n个元素逆序存放。在主函数中定义数组a,并以数组a做实参调用函数inv()。在进行函数调用时,数组名a所代表的数组a的首地址传递给形参指针x,使x指向主函数中数组a所在的存储区,从而实现了将数组a中的n个整数按相反的顺序存放的目的。2022/11/2voidinv(intx[],intn){

int

t,i,j,m=(n-1)/2;

for(i=0;i<=m;i++){j=n-1-i;t=x[i];x[i]=x[j];x[j]=t;}}main(){

inti,a[10]={8,7,9,1,0,6,7,3,4,2};inv(a,10);

printf("Thearrayhasbeenreverted:\n");

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

printf("%d,",a[i]);

printf("\n");}2022/11/2对inv()函数,可以用指针实现如下:voidinv(int*x,intn){

intt,*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;}}2022/11/2课堂练习1:下面程序的输出结果是:#defineMAX 3inta[MAX];fun1(){

intk,t=0;

for(k=0;k<MAX;k++,t++)a[k]=t+t;}fun2(intb[]){ intk; for(k=0;k<MAX;k++)

printf(“%d”,*(b+k));}main(){ fun1(); fun2(a);

printf(“\n”);}

运行结果为:024

2022/11/2课堂练习2:分析以下程序的输出结果。

floatsort(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);

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

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

运行结果为:87259

2022/11/2课堂练习3:分析下列程序的执行结果.

#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/2课堂练习4:

(程序运行结果)#include<stdio.h>intn=3;int

fun(intb[3][3]);/*声明函数*/main(){inta[3][3]={1,-2,-5,-1,2,5,-4,4,3},s;s=fun(a);

printf("s=%d\n",s);}int

fun(intb[3][3]){int

i,j,sum=0;

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

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

if(b[i][j]<i+j)sum=sum+b[i][j];

return(sum); }结果:-92022/11/2课堂练习5:分析下列程序的执行结果.#include<stdio.h>intn=3;int

fun(intb[]);/*声明函数*/main(){inta[9]={1,-2,-5,-1},s;s=fun(a);

printf("s=%d\n",s);}int

fun(intb[]){int

i,j,sum=0;

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

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

if(b[i]<i+j)sum=sum+b[i];

return(sum); }结果:-302022/11/28.6字符串与指针

在C语言中,字符串是以'\0'作为结束标志的字符数组,它有以下几种表示方法:(1)charstr1[]="Iamastudent!";

定义一个字符数组str1,其中存储的是字符串本身

(2)char*str2="Iamastudent!";

定义一个字符指针变量str2,其中存储字符串的首地址(3)char*str3=(char*)malloc(sizeof(char)*20);定义一个字符指针变量str3,指向一块动态申请的存储空间(4)strcpy(str3,str2);将str2所指向的字符串常量复制到str3所指向的存储空间中2022/11/2【例8.8】将字符串中所有字符'a'替换成字符'b'。#include"stdio.h"voidmain(){charstr[20]="Iamastudent!",*p;

for(p=str;*p;p++)

/*条件*p等价于*p!='\0'*/if(*p=='a')*p='b';

puts(str);}2022/11/2【例8.9】编写程序把字符串a复制到字符串b(不用strcpy函数)。#include"stdio.h"main(){chara[]="Iamateacher!";charb[20];

inti=0;

while(b[i]=a[i])i++;

printf("stringais:%s\n",a);

printf("stringbis:%s\n",b);}2022/11/2【例8.10】用函数调用方式实现字符串的复制。#include"stdio.h"voidstring_copy(char*from,char*to){inti=0;for(;(*(to+i)=*(from+i))!="\0";i++);

/*循环体为空语句*/}main(){charstr1[20]="Iamateacher.";charstr2[20];

string_copy(str1,str2);/*数组名作为实参*/

printf("%s\n",str2);}2022/11/2要点:1、字符串指针可以用来描述一个字符串。方法:char*str=“Iamastudent.”;2、意义 不是将字符串的内容赋值给指针变量,而是将其起始地址赋给它。

char*str;

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

puts(),gets()

scanf(),printf()的%s输出格式。运行结果为: ABCDE

BCDE

CDE

DE

E练习:分析下面的程序main(){ chararr[]=“ABCDE”;

char*ptr;

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

printf(“%s\n”,ptr);}2022/11/2练习:有以下的程序,输出结果为:main(){ char*p1=“programming”,*p2=“language”;

inti;

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

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

printf(“%c”,*(p1+i));}输出结果:ga2022/11/23字符指针与字符数组的区别字符数组由若干个元素组成,每个元素存放一个字符,而字符指针存放的地址(当处理字符串时存放的是字符串的地址);赋初值方式不同;

chara[]=“Iamastudent.”;

char*str=“IloveChina.”;2022/11/2赋值方式不同;

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

charstr[10];

str=“book”;

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

char*str;

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

charstr[];

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

而char*str;

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

intv[4]={0,0,0,0},k,i;

for(k=0;s[k];k++) {

switch(s[k]) { case'1':i=0;break; case'2':i=1;break; case'3':i=2;

温馨提示

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

评论

0/150

提交评论