语言-课件c7指针_第1页
语言-课件c7指针_第2页
语言-课件c7指针_第3页
语言-课件c7指针_第4页
语言-课件c7指针_第5页
免费预览已结束,剩余54页可下载查看

下载本文档

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

文档简介

12020/11/25c程序设计指针类型就是用来存放地址的变量类型如果

希望变量p用来存放地址值,那么就必须将p

定义为指针类型。反之,如果p为指针类型的变量,p只能存放地址值,而不能存放其他类型的数据。指针22020/11/25c程序设计例:用指针型变量

pa来存放变量a的地址。通过pa

a,先找到变量pa,得到

pa

的值为2000→

变量a的地址再到地址为2000的

单元中取得a

的值。6指针变量paa2000间接寻址200032020/11/25c程序设计指针变量的定义定义格式指向的类型说明符

*指针变量名;例:

int

*pt;*

—指针类型标记。pt

—指针变量名int—pt是指向整数类型的指针变量。42020/11/25c程序设计定义指针变量,指向整数类型;int

*p1;定义指针变量,指向实数类型;float

*p2;定义指针变量,指向双精度类型;double

*p3;定义指针变量,指向字符类型;char

*p4;除此之外,还可以定义指向数组的指针变量、指向函数的指针变量、指向结构体的指针变量等。52020/11/25c程序设计指针变量运算符&

:取变量地址;*

:取指针所指的变量的值;62020/11/25c程序设计阅读程序:void

main(){int

a,

k=4,

*p1;p1=

&k;a=(*p1)+7;printf("a=%d\n",

a);}akp120002000到4p1中找到地址,然后到该地址中取值41172020/11/25c程序设计一、普通指针变量与函数82020/11/25c程序设计指针变量存放的是地址值,可以作为函数的参数来进行"地址传送";实际参数可以是地址常量或指针变量;形式参数则为指针变量。92020/11/25c程序设计例1:

用函数来实现两个数的交换。#include <stdio.h

>void

main(){

int

a

=

3,b

=

5;void

swap(

int

x,

int

y);printf("交换之前

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

b);swap(a,b);printf("交换之后

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

b);}void

swap(int

x,int

y

){inttemp;temp=x;x

=

y;y=

x;}102020/11/25c程序设计c程序设计例:

用函数来实现两个数的交换。#include <stdio.h

>void

main(

){

int

a

=

3,b

=5;int

*pa=&a,*pb=&b;

printf("交换之前

:");printf("a=%d,b=%d\n",a,b);swap(pa,pb);printf("交换之后

:");printf("a=%d,b=%d\n",a,b);printf("*pa=%d,*pb=%d\n",

*pa,*pb);}void

swap(int

*p1,int

*p2

){

int

temp;temp

=

*p1;*p1

=

*p2;*p2

=

temp;

}void

swap(

int

*p1,int

*p2){

int

temp;temp

=

*p1;*p1=

*p2;

*p2

=

temp;

}p1p2temp*p

(a)*p2(b)&b&a353122020/11/25c程序设计swap()能否写成下面的形式呢?swap

(int

*p1,int

*p2){

int

*p;p

=p1;p1

=p2;p2=p;}这个程序能否实现两个变量内容的交换?132020/11/25c程序设计结论:当你需要在子函数中,将主函数内的变量值进行改变时,需要:将子函数的形式参数定义成:指针类型对应的实在参数应该是:对应变量的地址142020/11/25c程序设计练习:写一个函数,求一元二次方程的两个实根。编程要求:系数a,

b,

c由主函数传入。方程的根由参数传回主函数152020/11/25c程序设计函数程序:root{( int

a ,int

b ,int

c

,do)uble*x1double

delta;delta=sqrt(b*b-4*a*c);*x1

=

(-b+delta)/(2*a);*x2

=

(-b-delta)/(2*a);,double

*x2}162020/11/25c程序设计}2020/11/25c程序设计17主函数:if(d>==0)printf("x1=%f,x2=%f\n",x1,x2);求调ro用ot

(void

main(){

inta ,

b ,

c;

double

x1 ,

x2,d;printf("请输入方程的系数a,b,c:");scanf("%d%d%d",&a,&b,&c);d=b*b-4*a*c;调用求根函数a,b

,c

,&x1,&x2二、指针和数组182020/11/25c程序设计数组名是一个地址常量;计算机系统在处理数组时,在一个内存区域中,为数组分配一片连续的空间,并把这片区域的首地址值存入数组名中数组名是一个基类型为数组元素的基类型的地址常量。指针类型变量可以被赋予同类型的数组名的值;192020/11/25c程序设计1.一维数组与指针202020/11/25c程序设计int

A[8];意味着:A[0]A[1]A[2]A[3]A[4]A[5]A[6]A[7]A区的首地址,基础类型为intA的值是这片int

*p;意味着:p是一个指针变量,可以存放int型数据的首地址所以:

p

可以

指向

A

的每一个数组元素212020/11/25c程序设计指向数组的第i个元素:p=&A[i];p=&A[0];语句格式:指向数组的第一个元素:p=A;

或222020/11/25c程序设计用指针变量操作数组元素:用数组名操作数组元素:A[i];

*A*(A+i)用指针变量操作数组元素:p[i];

*p*(p+i)232020/11/25c程序设计p++,++p:/*使p指向数组的后一个元素

*/p--,--p:/*使p指向数组的前一个元素*/p+n:p-n:p-q:/*使p往后移n个元素*//*使p往前移n个元素*//*求指针变量p和q之间元素的个数,且q>p

*/6.

p+q:/*两个地址相加,无意义,不允许*/指针运算:242020/11/25c程序设计举例252020/11/25c程序设计void

main(){int

A[]={1,2,3,4,5,6};int

*p;p=A;printf("%d,",*p);printf("%d\n",*++p);}AA[0]

A[1]

A[2]

A[3]

A[4]

A[5]123456p&A[0]&A[0]262020/11/25c程序设计2020/11/25c程序设计例:编函数求一个3×4矩阵中的最大的元素,同时返回最大值在矩阵中的位置。定义函数:largest

(

float

a[3][4]数据描述:,)

int

*row

,int

*colmax

表示最大值函数实现:1)将a[0][0]

送给max;row

表示最大元素所在的行column表示最大元素所在的列*row=0;

*col=0

;2)从数组的第0行第0列开始,逐个与

max

进行比较,如果某个数组元素比max大,将该数组元素送入max中,同时记录行下标和列下标;函数:largest(}float

a[3][4],)

int

*row,int

*colint i

,

j

;{float

max;max=a[0][0];*row=0;

*column

=0;for

(

i=0

;

i<3;

i++)for(j

=0;

j<4;

j++

)if(a[i][j]>max){

max=a[i][j];

*row=i;*column=j;

}return

(max);给对应的实参赋值给对应的实参赋值指针型参数主函数:largest(void

main

(){}int

i,j,row,col;scanf

("%,

&a[i][j]);float

a[3]

[4],

Max;for

(

i=0;

i<3;

i++)for

(

j=0;

j<4;

j++)Max=

largest(

a ,

&r)float

a[3][4],int

*row,int

*col主函数中的printf

("the

largest

one

is

行:\n数,和M列a数x)

;printf

("row=%d,col=%d

:\n",

row,col)

;练习:1、写一个函数sort:对一个有n个元素的一维数组进行排序2、主函数完成原始数据的输入,调用函数sort,实现将一组无序的数据从小到大排序,并输出。302020/11/25c程序设计指针变量运算:int a[10],*p

,i;p

=

a;p++:使p指向下一个元素*p++:等价于*(p++),先得到*p,p后移*(p++)与*(++p)的区别:*(p++):先取*p,后移p

;*(++p):先向后移动p,后得到*p;4)++(*p):p所指向的内存单元的值加1312020/11/25c程序设计字符串与指针322020/11/25c程序设计C

语言用两种方法实现一个字符串用字符数组实现。例如:static

char str[]

=

"C

language";用字符指针实现。例如:char *pstr

=

"C

language";如下写法正确吗?char *pstr

;pstr

=

"C

language";字符串的表示形式332020/11/25c程序设计定义一个字符型数组,对它初始化,然后输出它#include<stdio.h>void

main(){char

string[]="I

love

china!";printf("%s\n",string);}342020/11/25c程序设计用一个字符指针指向一个字符串,对它初始化,然后输出它#include<stdio.h>void

main(){char

*string="I

love

china!";printf("%s\n",string);}352020/11/25c程序设计c程序设计写一个函数,输入一行字符,输出最长的单词。#include<stdio.h>#include<string.h>void

wordedit

(

char

ch1[80],

char

word[20]){int

i

=0

,k

,

j,

max=0; char

temp[20];while(

ch1[i]

!=‘

&&

ch1[i]

!=‘\0’){ word

[i]=ch1[i];

i++;

max++;

}word

[i]='\0';while(

ch1[i]

!='\0')

{k=0;while(ch1[i]

!='\0'&&ch1[i]

!='

'){

temp[k]=ch1[i];

i++;

k++;

}if(k>max){for

(j=0;j<k;

j++)

word

[j]=temp[j];max=k;

word[k]='\0';

}if(ch1[i]

!='\0')

i++;}}372020/11/25c程序设计void

main(){char

ch[80],

word[20];puts("please

input

a

string:

");gets(ch);wordedit(ch,word);puts(ch);puts(word);}382020/11/25c程序设计练习392020/11/25c程序设计1.输出字符串中的部分数据void

main(){char

str[80];char

*s1

=str;s1=

"C

language";s1+

=2;printf("%s\n",s1);}程序运行结果如下:language402020/11/25c程序设计下列程序段是用来判断数组中特定元素的位置所在。则输出结果为:int

fun(int

*s,

int

t,

int*k){ int

i;

*k=0;for(i=0;i<t;i++)if(s[*k]<S[i])*k=i;return

s[*k];

}void

main(){ int

a[10]={

876,675,896,101,301,401,980,431,451,777},k;fun(a,

10,

&k);printf("%d,

%d\n

",

k,

a[k]);

}412020/11/25c程序设计下面程序段的运行结果是:#define

N

10#define

M

10char

*find

(

char

(*a)[M],

int

n){

char

*q; inti;

q=a[0];for(i=0;i<n;i++)if

(

strcmp(a[i],

q)

<

0

)

q=a[i];return

q;}void void

main(){

char s[N][M]

={"tomeetme",

"you",

"and",

"he",

"china"};char

*p; int

n=5,

i;

p=find(s,n);

puts(p);

}422020/11/25c程序设计2有一行字符,要求删去指定的字符。#include<stdio.h>void void

main(){ void

del_ch(char

*p

,char

ch);char

str[80]

, *pt

,

ch;printf("请输入一个字符串:\n");gets(str); pt

=str;printf("请输入要被删除的字符:\n");ch

=

getchar();

del_ch(pt,ch);printf("新的字符串为:\n%s\n",str);}void

del_ch(char

*p,

char

ch){char

*q

=

p;for(

;

*p

!=

‘\0’;

p++)if(

*p

!=

ch

) *q++

=

*p;*q

=

'\0';}442020/11/25c程序设计#define

M

100void fun(int

m,

int

*a,

int

*n){

int i,

j=0;for(

i=1;

i<=m; i++

)if(

i%7==0

||

i

==0

)

a[j++]=i;*n=j;

}void void

main(){

int aa[M],

n,

k;

fun(10,aa,&n);for(

k=0;

k<M;

k++)if( k+1==

0) printf(

"\n“

);else printf

(

"%6d",

aa[k]);printf(

"\n"

);

}452020/11/25c程序设计3.

将若干字符串按字母顺序输出。#include<stdio.h>#include

<string.h>void

main(){void

sort(char

*name[]

,

int

n);void

print(char

*name[]

,int

n);char

*name[]={"BASIC","FORTRAN","PASCAL","COBOL"};int

n

=

4;sort

(

name

,

n

);print

(

name

,

n);}462020/11/25c程序设计void

print(char

*name[]

,int

n){int

i;for(

i

=

0

;

i

<

n

;

i++)printf("%s\n"

,

name[i]);}472020/11/25c程序设计void

sort(char

*name[]

,

int

n)

{char

*temp; int

i

,

j

,

k;for(

i=0;

i<n-1;

i++){ k

=

i;for

(

j

=

i

+

1

;

j

<

n

;

j++)if(

strcmp(name[k],

name[j])>0) k

=j;if

(

k

!=

i

)

{strcpy(temp,name[i]);strcpy(name[i],name[k]);strcpy(name[k],temp);

}}}482020/11/25c程序设计void

main(){char

*p1="abc",*p2="ABC",str[50]=

"xyz";strcpy(str+2,strcat(p1,p2));printf("%s\n",str);}492020/11/25c程序设计下面程序段的运行结果是:void

main(){char

ch[2][5]={"6937"

,

"8254"},

*p[2];int i,

j,s=0;for(

i=0;

i<2;

i++)

p[i]=ch[i];for(

i=0;

i<2;

i++)for(

j=0;

p[i][j]

>'\0';

j+=2)s=10*s

+

p[i][j]

-

'0';printf("%d\n",s);}502020/11/25c程序设计指针数组一、指针数组的定义

二、指针数组的初始化三、指针变量512020/11/25c程序设计指针数组的定义格式:类型标识符

*数组名[常量表达式]例:int

*a[4];定义了一个有4个元素的一维数组;数组的每个分量都是一个指向整型的指针;int *a[4];等同于int

*(a[4]);522020/11/25c程序设计指针数组的定义注意:[]

的运算优先级高于

*,如果写成int

(*a)[4];定义了一个行指针变量

a,指向有

4个元素的一维数组。532020/11/25c程序设计指针数组的初始化指针数组的初始化就是在定义指针数组时给其数组元素赋值;例:char

*p[]={" o",

"Why","Thanks"};指针数组的初值必须是地址;542020/11/25c程序设计将10个学生的

按从小到大的顺序输出。#include

"stdio.h"void sort(

char

*pc[],

int n

);void

main(){char

*p[10]; int

i;i++)s

温馨提示

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

评论

0/150

提交评论