理学C语言学习.pptx
《理学C语言学习.pptx》由会员分享,可在线阅读,更多相关《理学C语言学习.pptx(82页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、1知识回顾计算机的主要工作流程101010110101101111110111001110111100010110001111CPU(中央处理器)第第1页页/共共82页页2内存的组织结构内存的组织结构内部存储器,是由存储单元组成的。它的特点是内部存储器,是由存储单元组成的。它的特点是存储单元是线性连续的。存储单元的最小单位是存储单元是线性连续的。存储单元的最小单位是字节。字节。第第2页页/共共82页页3如何找到要存储的数据?如何找到要存储的数据?为了访问内存中的某个存储单元,我们为每一个为了访问内存中的某个存储单元,我们为每一个内存的基本存储单元编号,通过这个编号就可以内存的基本存储单元编号,
2、通过这个编号就可以访问该单元所存放的数据内容。这种编号称为内访问该单元所存放的数据内容。这种编号称为内存地址。存地址。第第3页页/共共82页页4变量与地址的关系变量与地址的关系系统给变量分配内存单元,变量在内存中可能会系统给变量分配内存单元,变量在内存中可能会占用几个连续的字节,开始字节的内存单元的地占用几个连续的字节,开始字节的内存单元的地址,就是变量的地址。址,就是变量的地址。20072007第第4页页/共共82页页5指针:一个变量的地址称为该变量的指针。指针:一个变量的地址称为该变量的指针。指针变量:若一个变量专用于存放另一个变量的地指针变量:若一个变量专用于存放另一个变量的地址(指针)
3、,则该变量称为指针变量。址(指针),则该变量称为指针变量。第第5页页/共共82页页6.2000200420062005整型变量整型变量i5变量变量i_pointer2001200220032000指针指针指针变量 变量的内容变量的内容 变量的地址变量的地址指针变量变量变量地址(指针)变量值指向地址存入指针变量第第6页页/共共82页页7u直接访问与间接访问直接访问与间接访问直接访问:按变量直接存取变量值直接访问:按变量直接存取变量值间接访问:通过存放变量地址的变量去访问变间接访问:通过存放变量地址的变量去访问变量量例 i=3;-直接访问指针变量指针变量.2000200420062005整型变量整
4、型变量i10变量变量i_pointer20012002200320003例 *i_pointer=5;-间接访问5第第7页页/共共82页页7.1.27.1.2指针变量的定义指针变量的定义*表示指向表示指向,若若p p指向指向i,pi,p中存放中存放i i的地址的地址,*p,*p表示表示p p指向的变量指向的变量 .3i *pi *pp1.1.指针变量的定义指针变量的定义类型名类型名 *指针变量名指针变量名其中其中:*不能省不能省;类型名类型名为指针变量指向变量的类型为指针变量指向变量的类型.例例:int i,*ip;int i,*ip;char ch,*cp;char ch,*cp;float
5、 f,*fp;float f,*fp;第第8页页/共共82页页例例:int i,*ip;:int i,*ip;ip=&i;ip=&i;char ch,*cp;char ch,*cp;cp=&ch;cp=&ch;float f,*fp;float f,*fp;fp=&f;注注:一个指针变量只能指向同一个类型的一个指针变量只能指向同一个类型的变量变量,必须定义其类型必须定义其类型.指针变量只能存放地址指针变量只能存放地址.ipi *ipcpch*cpfpf *fp200030004000第第9页页/共共82页页注意注意:u指针变量只能指向定义时所规定类型的变量。这个指针变量只能指向定义时所规定类型
6、的变量。这个规定的类型称为该指针变量的规定的类型称为该指针变量的“基类型基类型”。u定义指针变量后,并未确定该变量指向何处。也就定义指针变量后,并未确定该变量指向何处。也就是说该变量的值是不确定的。在引用指针变量前必是说该变量的值是不确定的。在引用指针变量前必须首先让它指向一个变量,这一点非常重要。须首先让它指向一个变量,这一点非常重要。p永远清楚每个指针变量指向了哪里?永远清楚每个指针变量指向了哪里?p永远清楚每个指针变量所指向变量中存储的内容是永远清楚每个指针变量所指向变量中存储的内容是什么?什么?p永远不要使用未赋值的指针变量。永远不要使用未赋值的指针变量。第第10页页/共共82页页7.
7、1.37.1.3指针变量的引用指针变量的引用*:指针运算符指针运算符(间接访问运算符、指向运算符间接访问运算符、指向运算符).&:取地址运算符取地址运算符main()int a,b;int*p1,*p2;a=100;b=10;p1=&a;p2=&b;printf(“%d%d”,a,b);printf(“%d%d”,*p1,*p2);第第11页页/共共82页页对对“&”、“*”、“+”及及“-”说明说明:“&”、“*”两个算符优先级相同两个算符优先级相同,运算顺序自右运算顺序自右至左至左.如如:int a,*p;p=&a;&*p的含义是什么的含义是什么?*&a的含义是什么的含义是什么?+,-与与
8、“*”优先级相同优先级相同,运算顺序自右至左运算顺序自右至左.如如:int a=2,*p;p=&a;printf(“%d“,*p+);printf(“%d“,(*p)+);printf(“%d“,*+p);printf(“%d“,+(*p);第第12页页/共共82页页2.2.指针变量的初始化指针变量的初始化初始化的一般形式为:初始化的一般形式为:类型名类型名 *指针变量名指针变量名=初始地址值;初始地址值;例如例如:int a,b;int*p1=&a,*p2=&b;第第13页页/共共82页页3.3.指针变量的引用指针变量的引用#include int main(void)int a=100,b
9、=10;int*p1,*p2;p1=&a;p2=&b;printf(%x,%xn,p1,p2);printf(%d,%dn,a,b);printf(%d,%dn,*p1,*p2);return 0;第第14页页/共共82页页例例:输入输入a和和b两个整数两个整数,按先大后小的顺序输按先大后小的顺序输出出.main()int*p1,*p2,*p,a,b;scanf(“%d%d”,&a,&b);p1=&a;p2=&b;if(ab)p=p1;p1=p2;p2=p;printf(“a=%d,b=%dn”,a,b);printf(“max=%d,min=%dn”,*p1,*p2);第第15页页/共共82
10、页页7.1.4指针变量作函数参数指针变量作函数参数指针作为函数参数指针作为函数参数,是将一个变量的地址传送到被是将一个变量的地址传送到被调函数调函数.例例:写一个函数将两个变量内容互换写一个函数将两个变量内容互换.swap(int x,int y)int p;p=x;x=y;y=p;main()int a,b;scanf(“%d%d”,&a,&b):if(ab)swap(a,b);printf(“%d%dn”,a,b);第第16页页/共共82页页swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;main()int a,b,*pa,*pb;scanf(“%
11、d%d”,&a,&b):pa=&a;pb=&b;if(ab)swap(pa,pb);printf(“%d%dn”,a,b);swap(int*p1,int*p2)int*p;*p=*p1;*p1=*p2;*p2=*p;swap(int*p1,int*p2)int*p;p=p1;p1=p2;p2=p;危险!危险!第第17页页/共共82页页由上可知由上可知:如想通过函数调用得到如想通过函数调用得到n个要改变的值个要改变的值,可可以如下进行以如下进行:在主调函数中设在主调函数中设n个变量个变量,用用n个指针变量指向它个指针变量指向它们们;将指针变量作实参将指针变量作实参,将这将这n个变量的地址传给所
12、调个变量的地址传给所调用的函数的形参用的函数的形参;通过形参指针变量通过形参指针变量,间接改变这间接改变这n个变量的值个变量的值;主调函数中就可以使用这些改变了值的变量主调函数中就可以使用这些改变了值的变量.例例:第第18页页/共共82页页例例:输入输入a,b,c三个整数三个整数,按大小顺序输出按大小顺序输出.swap(int*p1,int*p2)int p;p=*p1;*p1=*p2;*p2=p;xchang(int*q1,int*q2,int*q3)if(*q1*q2)swap(q1,q2);if(*q1*q3)swap(q1,q3);if(*q2 ,=,例例:ptr1=q;p-)scan
13、f(%d,p)q=a+9;p=a0;s=0;while(p=q)s+=*p;+p;printf(sum=%dn,s);第第27页页/共共82页页7.3 数组的指针和指向数组的指针变量数组的指针和指向数组的指针变量 数组的指针数组的指针:数组的起始地址数组的起始地址.数组元素的指针数组元素的指针:数组元素的地址数组元素的地址.7.3.1指向数组元素的指针变量的定义与赋值指向数组元素的指针变量的定义与赋值 例例:int a10,*p;p=&a0;p=a;int a10,*p;p=a;float f10,*fp;fp=f;char ch10,*cp;cp=ch;第第28页页/共共82页页7.3.2通
14、过指针引用数组元素引用数组元素的方法通过指针引用数组元素引用数组元素的方法下标法下标法;指针法指针法;例例:输出数组全部元素输出数组全部元素main()int a10,*p,i;for(i=0;i10;i+)scanf(“%d”,&ai);for(i=0;i10;i+)printf(“%d”,ai);for(i=0;i10;i+)printf(“%d”,*(a+i);for(p=a;pa+10;p+)printf(“%d”,*p);for(p=a,i=0;i10;i+)printf(“%d”,*(p+i);for(p=a,i=0;i10;i+)printf(“%d”,pi);第第29页页/共共
15、82页页注注:不允许改变数组首地址不允许改变数组首地址;例例:for(p=a;ap+10;a+)printf(“%d”,*a);注意指针变量的当前值注意指针变量的当前值.例例:main()int a10,*p=a,i;for(i=0;i10;i+)scanf(“%d”,p+);for(i=0;i10;i+,p+)printf(“%d”,*p);不能改变常量的值不能改变常量的值应插入语句 p=a;第第30页页/共共82页页注意指针变量的运算注意指针变量的运算:int a10=0,1,2,3,4,5,6,7,8,9,*p=a,i;p+;*p=*p+1;for(p=a,i=0;i10;i+)prin
16、tf(“%d“,*p+);for(p=a,i=0;i10;i+)printf(“%d“,+(*p);i=2;p=&ai;*(p-)与与ai-什么关系什么关系?*(+p)与与a+i什么关系什么关系?*(-p)与与a-i什么关系什么关系?for(p=a,i=0;i10;i+)printf(“%d“,*+p);第第31页页/共共82页页3.数组名作函数参数数组名作函数参数数组名作实参时数组名作实参时,传送的是数组的首地址传送的是数组的首地址,对应的形参应该为接受地址对应的形参应该为接受地址的同类型指针变量的同类型指针变量.例例:将数组将数组a中中n个整数按相反顺序存放个整数按相反顺序存放.void
17、inv(int x,int n)int t,i,j;for(i=0,j=n-1;ij;i+,j-)t=xi;xi=xj;xj=t;main()int i,a10=0,1,2,3,4,5,6,7,8,9;inv(a,10);for(i=0;i10;i+)printf(“%d“,ai):void inv(int*x,int n)int t,i,j;for(i=0,j=n-1;ij;i+,j-)t=xi;xi=xj;xj=t;void inv(int*x,int n)int t,i,j;for(i=0,j=n-1;ij;i+,j-)t=*(x+i);*(x+i)=*(x+j);*(x+j)=t;vo
18、id inv(int*x,int n)int t,*i=x,*j=x+n-1;for(;ij;i+,j-)t=*i;*i=*j;*j=t;第第32页页/共共82页页【例【例7.8】用起泡排序法对】用起泡排序法对N个整数从小到大排序。个整数从小到大排序。#define N 10void main()void sort(int*b,int n);/*声明被调函数声明被调函数*/int aN,i;for(i=0;iN;i+)scanf(%d,&ai);sort(a,N);for(i=0;iN;i+)printf(%d ,ai);第第33页页/共共82页页void sort(int b,int n)/
19、*定义定义sort函数函数*/int i,j,t;for(i=1;in;i+)for(j=0;jbj+1)t=bj;bj=bj+1;bj+1=t;void sort(int b10,int n)void sort(int*b,int n)第第34页页/共共82页页7.3.4 多维数组的指针多维数组的指针1多维数组的地址及其表示多维数组的地址及其表示:int a34;a0a1a2a0 a0 a0 a0a1 a1 a1 a1a2 a2 a2 a2aa&a0a+1&a1a+2&a2 a0 *(a+0)a1 *(a+1)a2 *(a+2)a0+j *(a+0)+j&a0j a1+j *(a+1)+j&
20、a1ja2+j *(a+2)+j&a2j j j从从0 0到到3 3012301230123第第35页页/共共82页页思考:数组名字的含义和操作思考:数组名字的含义和操作设有一个二维数组;假设数组地址从设有一个二维数组;假设数组地址从20002000开始开始int a34=1,3,5,7,9,11,13,15,17,19,21,23int a34=1,3,5,7,9,11,13,15,17,19,21,23考虑考虑a a,a0,a12a0,a12的意义的意义考虑考虑a+1,a0+1,a12+1a+1,a0+1,a12+1的含义的含义考虑考虑*(a+1),*(a0+1),*(a12+1)(a+1
21、),*(a0+1),*(a12+1)考虑考虑&(a+1),&(a0+1),&(a12+1)&(a+1),&(a0+1),&(a12+1)第第36页页/共共82页页a12 a12,a a的意义:的意义:a12a12是元素值是元素值a a代表二维数组首元素的地址,首元素不是一个整型变代表二维数组首元素的地址,首元素不是一个整型变量,而是由量,而是由4 4个整型元素所组成的一维数组,因此个整型元素所组成的一维数组,因此a a代代表的是首行的首地址表的是首行的首地址*a a代表代表0 0行行0 0列的地址即列的地址即&a00&a00如果首行首地址是如果首行首地址是20002000,则,则a+1a+1是
22、多少?是多少?a+2a+2是多少?是多少?a+1a+1的地址,为的地址,为20082008;a+2a+2的地址,为的地址,为2016 a12 2016 a12 是元素的内容是元素的内容第第37页页/共共82页页aiai是一维数组名,是一个地址,它以数组的一个元是一维数组名,是一个地址,它以数组的一个元素的地址,作为地址。素的地址,作为地址。a0a0:代表一维数组:代表一维数组a0a0中第中第0 0列元素的地址,即列元素的地址,即&a00&a00,值为,值为20002000;a1:a1:代表代表&a10&a10,值为,值为20082008a0a0的意义:的意义:第第38页页/共共82页页a+ia
23、+i是指向行的指针,是指向行的指针,ai+jai+j是指向列的指针,是指向列的指针,在指向行的指针前加一个在指向行的指针前加一个“*”“*”,就转换为指,就转换为指向列的指针,如向列的指针,如*(a+1)(a+1);在指向列的指针前面;在指向列的指针前面加一个加一个“&”&”,就成为指向行的指针,如,就成为指向行的指针,如&a0&a0与与a a等价等价*,和,和&操作符:操作符:第第39页页/共共82页页数组数组a a的性质的性质表示形式表示形式含义含义值值a a二维数组名,指向一维数组二维数组名,指向一维数组a0a0,即第,即第0 0行首地址行首地址20002000a0,*(a+0),*aa
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 理学 语言 学习
限制150内