可靠性与系统工程学院生专业课课件-08 .c语言程序设计_第1页
可靠性与系统工程学院生专业课课件-08 .c语言程序设计_第2页
可靠性与系统工程学院生专业课课件-08 .c语言程序设计_第3页
可靠性与系统工程学院生专业课课件-08 .c语言程序设计_第4页
可靠性与系统工程学院生专业课课件-08 .c语言程序设计_第5页
已阅读5页,还剩25页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

C语言程序设计指针指针是存储变量的地址变量ci变量的存贮方式计算机的内存是线性空间。变量定义时,系统根据变量的类型分配一段连续的存贮单元。inti=64;charc='A';floatff=3.14;longk=54321;doublefd=2.71828;64'A'3.14543212.718282byte1byte4byte4byte8byte......0B3C01000B3C01010B3C01020B3C01030B3C01040B3C01050B3C01060B3C01070B3C01080B3C01090B3C010A0B3C010B0B3C010C0B3C010D0B3C010E0B3C010F0B3C01100B3C01110B3C0112ffkfd最小存贮单位是字节,每个字节都有一个唯一的编号,即地址。变量所占空间的第一个字节的地址称为变量的地址。通过变量的地址也可以访问变量!变量的访问方式用变量名访问b=66;FFFD转换地址FFFD66用地址访问(FFFD)=66;*p=66;指针:专门用于保存地址的变量。保存地址p指针的定义类型└┘*变量名;int*p;float*pf;char*ps;注意事项:1.*是指针的标志,表明该变量为指针变量,其所保存的内容为变量的地址,不可省略,但它并不是变量的一部分;2.指针变量有类型,只能保存相应类型变量的地址;3.指针变量的命名规则与普通变量相同。指针的操作a????????????????p&

取地址操作:

p=&a;

取内容操作:

b=*p;b????????????????p*&和*是一对互逆操作获取变量地址:&

inti,*p; p=&i;

注意与&&的区别获取指针指向的内容:*

inti=66,j,*p; p=&i; j=*p;

注意与定义中*的区别 *和&是一对互逆操作。指针赋值

inti,*p1,*p2; p1=&i; p2=p1;指针的基本使用0A1D10110A1D10120A1D10130A1D10140A1D10150A1D1016ip0A1D10110A1D10110A1D10120A1D10130A1D10140A1D10150A1D10160A1D10170A1D1018ip0A1D1011j6666相当于i指向指针的初始化与普通变量一样,指针可以在定义的同时初始化。inta;floatdata;charc;int*pa=&a;float*pdata=&data;char*pc=&c;double*pd=NULL;1.&是取变量地址的操作;2.指针所保存的具体值是不固定的;3.指针的初始化也称将指针指向某处;4.不指向任何地方的指针定义为空指针NULL;5.未初始化或未赋值的指针不能引用。指针基本应用实例main(){ inta,b,c,*p1,*p2,*p3; a=10; b=25; p1=&a; p2=&b; p3=&c; printf("%d,%d,%d,%d\n",a,b,*p1,*p2); c=a; a=b; b=c; printf("%d,%d,%d,%d\n",a,b,*p1,*p2);

*p3=a;

*p1=*p2; b=*p3; printf("%d,%d,%d,%d\n",a,b,*p1,*p2);}执行结果:10,25,10,2525,10,25,1010,25,10,25例1:用星号加指针的方法访问变量与用变量名访问变量是一样的。指针的运算a[0]p1a[1]a[2]a[3]a[4]p2p3p4p5指针与整数加减运算——

指针移位inta[5];int*p1,*p2,*p3,*p4,*p5;p1=&a[0];p2=p1+4;p3=p2-2;p4=p1;p4++;p5=p2;p5--;注意:指针的移位是与变量类型相关的。指针间的关系运算——

位置比较if(p5>p3)...含义:如果p5在p3的后面;if(p1==p3)...含义:如果p1和p3指向同一个地址;if((p1<p3)&&(p2!=p5))...指针定义必须逐一说明;

int*p1,p2;指针变量保存的内容是地址,不能和普通变量/常量直接操作;

inta,*p; a=66; p=1000;

指针变量未初始化之前指向不确定的内容,不能直接引用;

inta,*p; a=*p;

*p=66; 指针只能和整数进行加减运算;

inta,*p; p=&a+12.5; p=p*3;指针变量之间算数运算没有意义(减法除外);

int*p1,*p2,*p3; p3=p1+p2; p3=p1*p2;

p3=p1/p2;指针基本应用中常见的错误←p2将是一个整型变量←不会将地址1000赋给p←a将得到一个不确定的值←向不确定的空间写数据,严重错误!后果无法预料,也难以发现。指针变量作为函数参数swap(int*p1,int*p2);main(){ inta,b,*pa,*pb; a=10; b=20; pa=&a; pb=&b; printf("%d,%d",a,b); swap(pa,pb); printf("%d,%d",a,b);}swap(int*p1,int*p2){ inttemp; temp=*p1;

*p1=*p2;

*p2=temp;}虽然在swap函数中不能直接访问变量a,b,但它们并没有消失,而是处于挂起状态,对swap函数是不可见的。主函数swap执行结果:10,2020,10当我们希望在函数中对调用程序的变量进行修改时可以使用这种方式。abpapbp1p2temp用指针从函数带回多个结果一般函数可以向函数传递若干参数,但只能返回一个参数。

例如:

intfunction(floata,intb,charc);

如何传回多个参数,可以这样吗:(max,mid,min)=sort(a,b,c);

用指针做参数可以间接实现多变量返回。main(){ inta,b,c; intmax,mid,min; int*pmax,*pmid,*pmin; a=1; b=2; c=3; pmax=&max; pmid=∣ pmin=&min; sort(a,b,c,pmax,pmid,pmin);}sort(inta,intb,intc,int*p1,*p2,*p3){ intx,y,z; x=max(a,b,c); y=mid(a,b,c); z=min(a,b,c);

*p1=x;

*p2=y;

*p3=z;}123maxcbamidminpmaxpmidpminp1p2p3main函数sort函数321用指针从函数带回多个结果

用函数计算两个数的和与差#include<stdio.h>plusmin(inta,intb,int*p1,int*p2);main(){ inta,b,plus,minus,*pa,*pb; scanf("%d%d",&a,&b); pa=+ pb=− plusmin(a,b,pa,pb); printf("%d+%d=%d\n",a,b,plus); printf("%d-%d=%d\n",a,b,minus);}plusmin(inta,intb,int*p1,int*p2){

*p1=a+b;

*p2=a-b; return(0);}abplusminuspapbabp1p2mainplusminscanf()函数的实现原理voidscanf(int*rdata){ int key; ...... ...... ......

*rdata=key;}通过系统底层功能获取键盘的实际按键,并将其值赋予key。一般函数调用数据流:

将数据通过参数列表拷贝给形参,在函数内部对数据进行处理,将处理结果用return语句返回给调用函数。 当提供给函数的数据中包含有指针时,处理后的数据多了一个返回通道。数据函数return(?)将变量的地址传递给函数写一个函数,计算两个数的最大公约数和最小公倍数,用指针将结果返回。 提示:voiddivmulti(intdata1,intdata2,int*p1,int*p2);作业

从键盘读入一整数,用指针的方式向一函数传递该数值,在函数中完成阶乘的计算,并在主函数中打印结果。

提示:函数形式:doublefactorial(int*p);指针与数组下标法访问数组:inta[10];......a[3]=5;a[1]=a[2]*a[4]-a[3];指针法访问数组:

inta[10],*p;

p=a;

*p=0;

*(p+1)=1;

*(p+2)=2; ......

*(p+9)=9;C语言规定:数组名代表数组第一个元素的地址。a[0]a[9]pp+1p+2p+9for(n=0;n<10;n++){

*p=n; p++;}0123456789p=&a[0];a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]****数组访问方法的本质main(){inta[10],i,*p;for(i=0;i<10;i++)scanf("%d",&a[i]);printf("\n");p=a;for(i=0;i<10;i++)printf("%d",a[i]);}printf("%d",*(a+i));C编译系统将a[i]转换为*(a+i)处理printf("%d",*p);p++;直观,但速度较慢执行速度较快用指针访问数组时易犯的错误main(){inta[10],i,*p;p=a;for(i=0;i<10;i++){scanf("%d",p);p++;}for(i=0;i<10;i++){printf("%d",*p);p++;}}a[0]a[9]pppppp=a;pa[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]用指针访问数组时易犯的错误main(){inta[10],i,*p;p=a;for(i=0;i<10;i++){scanf("%d",p);p++;}for(i=0;i<10;i++){printf("%d",*a);a++;}}虽然数组名也是指针,并且指向数组的第一个元素,但它是常量,不能改变。C语言规定:数组名本身也是一个指针,但它不可变。利用指针向函数传递数组main(){ inta[10],b[5],i; for(i=0;i<10;i++) a[i]=2*i; for(i=0;i<5;i++) b[i]=i*i; print_array(); print_array();}voidprint_array(int*data,intnum){ inti; printf("Thearrayis:"); for(i=0;i<num;i++) { printf("%d,",*data); data++; } printf("\n");}Thearrayis=0,2,4,6,8,10,12,14,16,18Thearrayis=0,1,4,9,16执行结果:例2:利用函数打印数组a,10

b,5利用指针向函数传递数组main(){inta[10],large,index,i,*p;p=a;for(i=0;i<10;i++){scanf("%d",p);p++;}large=max(a,10,&index); ...... ......}intmax(int*data,intnum,int*loc){intbig,i;big=*data;for(i=0;i<num;i++){if(*data>big){ big=*data;

*loc=i;}data++;}return(big);}例1:用函数查找数组的最大值及其所在位置作业:在一个函数中用冒泡法实现数组排序。数组名作函数参数指针与字符串字符串的定义与初始化:以前学过的方式:charuniver[20]={"BUAA"};charuniver[20]="BUAA";charuniver[]="BUAA";指针方式:char*univer_p="BUAA";指针方式的执行过程:计算字符串长度申请空间申请指针空间指针指向字符串向字符串空间赋值...BUAA\0...?univer_p注意:用指针方式定义的字符串没有名字,只能通过指针方式访问。char_temp[]="BUAA";char*univer_p=_temp;相当于字符串指针的基本使用(一)#include<stdio.h>main(){ chara[]="BeihangBUAA",*p1,*p2; p1=a; p2=&a[8]; printf("String1is:%s\n",p1); printf("String2is:%s\n",p2);}例3.

用指针的方式访问字符串执行结果:String1is:BeihangBUAAString2is:BUAABeihangBUAA\0p1p2a[0]a[1]a[2]a[3]a[4]a[5]a[6]a[7]a[8]a[9]a[10]a[11]a[12]main(){ chara[]="Hello,world!",b[20],*p1,*p2; p1=a; p2=b; for(;;){ if(*p1='\0')break;

*p2=*p1; p1++; p2++; } printf("String1is:%s",a); printf("String2is:%s",b);}字符串指针的基本使用(二)例4.

用指针的方式实现字符串拷贝for(;*p1!='\0';){......}for(;*p1!='\0';p1++,p2++){......}for(p1=a,p2=b;*p1!='\0';p1++,p2++){......}*p2='\0';==字符串指针作为函数参数main(){char*a="Ilikeprogramming";char*b[100];copy_string(a,b);printf("%s",b);}向函数传递字符串指针与向函数传递数组指针本质上是一样的,唯一的区别在于不需要明确告诉函数字符串的长度。例4.

利用函数实现字符串拷贝copy_string(char*str1,char*str2){ while(;;) { if(*str1=='\0')break;

*str2=*str1; str1++; str2++; }

*str2='\0';}我们用自己编写的copy_string函数代替了库函数中的strcpy函数。作业:自己实现字符串拼接函数strcat()。关于字符串的注意事项字符串的本质:带有结束标志的字符数组。

(1).数组有多大就占用多少内存空间;

(2).对于数组一般不能进行整体操作;

charstr

温馨提示

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

评论

0/150

提交评论