第一篇:指针概念知识点总结--经典
指针概念知识点
● 变量的地址就是变量的指针。变量的值和变量的地址是不同的概念,变量的值是该变量在内存单元中的数据。用来存放指针(地址)的变量就称为指针变量。
● 若把某变量的地址赋值给指针变量p,则称指针变量p指向该变量。
● 定义指针变量的一般形式为:类型名*指针变量名;,其中“*”为说明符,而不是运算符。
● 通常指针变量可以通过以下几种方法获得地址:通过地址运算“&”赋值,指针变量的初始化,通过其他指针变量赋值,用NULL给指针变量赋空值,以及通过调用标准函数赋值。
● “*”称为指针运算符(单目运算符),也称取内容运算符。当指针变量p指向一个变量x时,可以用*p的形式存取该变量的值。此时,*p与变量x相互等价。
● 取地址运算符“&”与指针运算符“*”作用在一起时,有相互“抵消”的作用。对于变量x,*&x与x相互等价。
● 若定义了一维数组a和指针变量p,且p=a;,则以下四种表示相互等价:a[i]、p[i]、*(a+i)、*(p+i)。
● 未对指针变量p赋值即p没有指向时,而就对*p赋值,该值就代替了内存中某单元的内容,有可能出现不可意料的错误。
● 一个数组的元素在内存中是连续存放的,数组第一个元素的地址称数组的首地址。在C语言中,数组名是该数组的首地址,因此,数组名是指针常量。
● 当指针变量p指向数组元素时,p加上一个正整数n,则当前指向为相对p向前移动n个元素的位置;p减去一个正整数n,则当前指向为相对p向后移动n个元素的位置。
● 假设指针变量p、q指向同一数组,若p指向地址较大元素,q指向地址较小的元素,则p>q的值为1(真),且p ● 假设指针变量p、q指向同一数组,p-q的值等于p所指对象与q所指对象之间的元素个数,若p>q则取正值,p ● 把字符串常量赋值给字符指针变量,相当于把该字符串常量的首地址赋值给字符指针变量。 ● C语言的二维数组由若干个一维数组构成。若有定义语句:int a[M][N], i, j;,则以下元素的七种表示相互等价:a[i][j]、*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[j]、*(&a[0][0]+N*i+j)、*(a[0]+N*i+j)、*(*a+N*i+j)。 ● 若有语句:int a[M][N], i, j,(*pi)[N];,则指针变量pi指向“包含N个整型元素的一维数组”。当pi=a;时,pi+1将跳过N个元素指向下一行,故称pi为行指针,也称pi是(指向一维)数组(的)指针。若pi=a;,则以下五种元素的表示相互等价:a[i][j]、pi[i][j]、*(pi[i]+j)、*(*(pi+i)+j)、(*(pi+i))[j]。 ● 除了由二维字符数组可以构成字符串数组外,还可以定义一个指针数组,并在定义时用字符串赋初值的方法,构成一个字符串数组。 ● 指向指针的指针变量,经过二次间接存取后才能存取到变量的值。 ● 通常用指针数组的每个元素pa[i]指向二维数组a的每行第0列元素的首地址,然后用指向指针的指针变量pp指向指针数组,此时,pp+1指向数组指针pa的下一个元素,也就是 pp+1指向二维数组a的下一行。如果a是二维字符数组,则pp+1指向下一个字符串。 ● 当指针变量指向某一结构体变量时,可用下述三种方式之一存取结构体成员(三种方式是等价的):结构体变量名.成员名、指针变量名->成员名、(*指针变量名).成员名。 ●若p指向数组a,则:⑴ p++(或p+=1),使p指向下一元素。⑵ *p++等价 *(p++)。作用是先得到p指向的变量的值(即*p),然后再使p+1→p。⑶ *(p++)与*(++p)不同。前者为a[0],后者为a[1]。⑷(*p)++表示p指向的元素值加1,即(a[0])++⑸ 如果p当前指向a数组中第i个元素,则: *(p--)相当于a[i--],先对p进行*运算,再使p自减; *(++p)相当于a[++i],先使p自加,再作*运算。*(--p)相当于a[--i],先使p自减,再作*运算。 第一章 计算机网络概念 1.网络的定义 A 将地理位置不同但具有独立功能的多个计算机系统,通过通信设备和通信线路连接起来,在功能完善的网络软件(网络协议、网络操作系统、网络应用软件等)的协调下实现资源共享的计算机系统的集合。 B 以资源共享为目的的自主互联的计算机系统的集合。 C 四个元素:独立自主的计算机系统的集合; 要通过通信介质将计算机连接起来; 要有一个共同遵守的规则或协议; 以资源共享和数据通信为目的。 2.使用网络的目的:a资源共享:可共享的资源包括:硬件资源、软件资源和数据资源。 B在线通信:视频会议、远程医疗会诊和远程教育等。 3.计算机网络是计算机技术和通信技术相结合的产物。 4.网络的发展阶段 A计算机终端网络 1)分时多用户联机系统、面向终端网络 2)具有通信功能的单机系统 3)开始标志:1952年美国SAGE系统的诞生被誉为计算机通信发展史上的里程碑。 4)实现了“计算机—终端”的通信,传输特点:主机(PC)--通信线路—终端 5)主机任务:数据处理、数据通信、数据存储 6)终端:不具备处理能力和存储功能 7)缺点:主机负荷重;线路利用率低 8)硬件设备:主机、终端、通信线路 9)模型 B 计算机通信网络 1)具有通信功能的多机系统 2)20世纪60年代中期 3)主要目的:传输信息 4)实现了“计算机—计算机”的通信 5)硬件设备:主机、终端、集中器(HUB)、通信控制处理机(CCP)、通信线路 6)通信控制处理机:数据通信 7)集中器:数据的收集和分发 8)缺点:缺乏统一的软件控制信息交换和资源共享。9)模型 C 计算机网络 1)开始标志:ARPANET的诞生 a)1969年 b)第一个以资源共享为目的的计算机网络 c)采用分组交换技术 d)是Internet的前身 e)将网络分为资源子网和通信子网 f)实现了“计算机—计算机”的通信 g)采用分层的协议 h)是广域网 i)标志着计算机网络进入到了第三个阶段 2)硬件组成:与计算机通信网络组成相同 3)与计算机通信网络的区别:计算机网络是由网络操作系统软件来实现网络的共享和管理的,而计算机通信网络中,用户只能把网络看作是若干个功能不同的计算机系统的集合,为了访问这些资源用户需要自行确定其所在的位置,然后才能调用。 4)模型:参考计算机通信网络 5.计算机网络按照功能(逻辑)划分:通信子网和资源子网 1)资源子网 a)层次:上三层,会话层、表示层、应用层 b)功能:数据处理 c)硬件设备:主机(服务器)、终端(用户工作站)、打印机 2)通信子网 a)层次:下三层,物理层、数据链路层、网络层 b)功能:数据传输、数据通信 c)硬件设备:通信介质、集线设备 6.书上划分方法,计算机网络划分成四个阶段 1)面向终端的计算机网络 a)定义:以传输信息为目的而连接起来,实现远程信息处理或进一步达到资源共享的系统 b)代表:1台主机2000多个终端组成的订票系统 2)多主机互联计算机网络 a)定义:以能够互相共享资源为目的互联起来的具有独立功能的计算机的集合体 b)技术基础:分组交换 c)代表:ARPANET 3)标准计算机网络 a)标志:OSI的公布 b)1984年,ARPANET分解成两个网络 APRANET 民用科研网 MILNET 军用科研网 其中APRANET是Internet主干 c)1986年,NSF建立国家科学基金网NSFNE,由主干网、地区网、校园网组成。 d)1989-1990,NSFNET主干网成为Internet的主要部分。4)高速网络技术阶段 a)主要特点:综合化、高速化 b)综合化:多种业务综合到一个网络中,综合业务数字网ISDN c)优点:经济 d)多媒体技术:同时获取、处理、编辑、存储和显示两种以上不同类型信息的媒体技术 e)高速化:(宽带化)速度达到几十至几百兆,甚至几十吉比特 7.OSI参考模型 1)1974年提出、1977年着手制定、1981年正式公布 2)由ISO(国际标准化组织)提出 3)全称:开放系统互联参考模型 4)采用分层结构,将网络分成7层 5)从下到上:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层 6)层间关系:上层使用下层的服务,下层为上层提供服务 7)层间通过接口提供服务 8)是参考模型,并非实际产品 9)标志着网络进入到标准化时期 10)所谓的开放,符合OSI标准均可互联成为网络 8.TCP/IP体系结构 1)1974年公布 2)实质:一组协议簇 3)主要包含两个协议:TCP传输控制协议,IP网际互连协议 4)由于ARPANET和UNIX的发展,使得TCP/IP获得进一步发展 5)特点:简单、实用 6)四层:网络接口层、网际层、传输层、应用层 7)规定在Internet中以IP分组为单位传输 8)其中IP协议工作在用于连接2个或多个网络的路由器中 9)是实际应用产品 10)标志着网络进入到了第三个网络时代 9.计算机网络在中国 1)在中国,最早着手广域网的部门是铁道部 2)1989年,第一个公用分组交换网(CHINAPAC)试运行 3)中国公用计算机互联网(China net)a)俗称“163网” b)第一个开通的商业网 c)1995年,原邮电部开发 d)Sprint公司开通两条64K专线标志正式启动 e)全国大多数通过该网进入因特网 4)中科院科技网(CSTNET)a)1994年,中国科学院 b)NCFC连入64K,标志我国被国际承认有Internet的国家 5)国家教育科研网(CERNET)a)1994年,国家教委 6)中国金桥网(China GBN)a)1994年,原电子部 10.中国的三金工程:金桥、金关、金卡 11.1987年,钱天白教授发出第一封E-mail,标志着Internet成为中国的一部分,揭开了Internet在中国发展的序幕。 12.1990年,钱天白注册了中国的顶级域名,CN 13.三网合一:电信网、广播电视网、计算机通信网相互渗透,相互兼容。 14.计算机网络的功能 1)数据通信:实现服务器与工作站、工作站与工作站之间的数据传输,是基本功能。2)资源共享:硬件资源、软件资源、数据资源 3)分布式处理:大型信息处理问题借助于分散在网络中的多台计算机协同完成。分布式输入、分布式计算(将大型综合问题,通过一些算法分别交给不同的计算机进行处理)、分布式输出 4)均衡负载相互协作 5)综合信息服务 15.计算机网络的分类 1)按作用范围分类 a)局域网(LAN) 通常作用与一座大楼,一所学校(1-20km) 是专用网 拓扑结构:总线型、星形、环形 最常用的:总线型 传输介质:双绞线、同轴电缆、光纤 最常用的介质:5类UTP 特点:传输速率快,误码率低 最主要特点:覆盖范围小 网络的控制趋于分布式 b)城域网(MAN) 覆盖范围:一个城市(大于50km) 传输介质:光纤 即能用于专用网又能用于公用网 c)广域网(MAN) 又称为远程网 范围:一个国家甚至全球 拓扑结构:网状(分布式、无规则) 传输介质:常常借用公用电话网(公共传输介质)传输数据 特点:传输速度慢,误码率高 采用分组交换技术 常见的广域网:Internet、Arpanet、中国的四大网络 2)按照使用范围划分(网络的所有权)a)公用网,Internet、CHINANET b)专用网:归某个部门所有 3)按照网络的管理方式分类(按计算机所处的地位划分)a)对等网 计算机的地位相等,无主从之分,没有专门的服务器 规模:不超过10台计算机 b)客户机/服务器网络(基于服务器的网络) C/S(Client/Server) 有专门的计算机充当服务器 如果有计算机使用带server的系统,只能组成C/S的网络 4)按照数据的传输方式分类 a)点对点网 计算机或设备通过单独的链路进行数据传输 采用点对点传输的拓扑结构:星型、环形、树形、网状 b)广播网 网络中的计算机或设备通过一条共享的通信介质进行数据传输 主要应用于局域网中 采用广播传输的拓扑结构:总线型 常见的传输类型:单播、组播、广播 单播:有一个确定的目的端,只有该目的端接收广播 组播(多播):接收端是一组主机 广播:接收端是全部主机 广播域:广播所能覆盖的范围 一个广播中的节点数太多或广播域太大,会引起广播域中的广播泛滥,需要分割子网。 广播风暴:当广播的数量超过网络所允许的正常范围。5)按拓扑结构划分 a)拓扑结构:物理拓扑和逻辑拓扑 b)直接影响到网络设计、功能、可靠性和通信费用 c)拓扑结构:点和线组成的几何图形 d)网络中节点 转接节点:转接和交换信息,包括交换机、集线器和终端控制器 访问节点:包括计算机和终端,是信息交换的源节点和目标节点 e)总线型 各个节点用一根总线连接,两端装有防止信号反射的终结器 任何时刻最多只有一台计算机传输数据 传输方式:广播 优点:结构简单,可扩充性好,需要电缆长度短,共享资源能力强,安装方便 缺点:对线路敏感 任何一个节点故障都不会影响整个网络 f)星型 由中央节点和与中央节点直接通过各自独立的电缆连接起来的站点组成 中央节点:集线器、交换机 采用集中式通信控制策略 优点:易于故障的诊断与隔离;易于网络的扩展;依赖于中央节点 缺点:过分依赖中央节点,一旦中央节点故障,整个网络瘫痪 g)环形 节点和线首尾相连形成一个闭合的环 特点:传输方向固定,传输时延固定 优点:传输质量高,可用各种介质,实时性好,需要介质长度短 缺点:扩展难,可靠性不高,任何一个节点故障,整个网络瘫痪 常见的环形拓扑网络:令牌环、FDDI、CDDI h)树形 是星形拓扑的扩展 便于分层管理 根节点故障,整个网络瘫痪 又称为多出力中心集中式网络 i)网状 又叫无规则或分布式网络 用于广域网 可靠性高,资源共享方便 缺点:结构复杂,必须采用路由选择算法和流量控制方法来实现正确传输 6)按照传输带宽分类 a)基带网 b)宽带网 宽带线路:每秒有更多的比特从计算机注入到线路 宽带线路和窄带线路上比特的传输速度一样 正确概念:宽带和窄带速度一样,宽带车距短,窄带车距宽 错误概念:宽带速度快,窄带速度慢 错误概念:宽带相当于多车道(通信线路上通常都是串行传输的)7)按数据交换方式 a)电路交换 b)分组交换 c)综合交换 8)按传输介质划分 a)同轴电缆网 b)双绞线网 c)光纤网 d)卫星网 16.计算机网络的组成 1)网络硬件 a)服务器 网络的核心 提供服务资源并起服务作用 可分为文件服务器、打印服务器、应用系统服务器 b)工作站 连接到网络中的计算机 一般不用来管理共享资源 c)传输介质 连接计算机与计算机、计算机与集线器的没接 d)集线设备 可以是集线器或交换机 2)网络软件 a)网络操作系统(NOS) 用于管理、调度和控制计算机的各种资源,并为用户提供友好的操作界面 运行在服务器上 常见的NOS:UNIX、Linux、Windows 局域网网络操作系统:Netware b)工作站软件(通信软件、通信协议) 运行在工作站上 c)网络应用软件 d)网络管理软件 17.网络的基本服务 1)文件服务:对数据文件的有效存储、提取以及传输,包括文件传输、文件存储及数据移动、文件同步更新和文件归档等功能。 2)数据库服务:基于数据库服务器进行数据存储和提取操作 3)打印服务:用来控制和管理打印机和传真设备的访问 4)消息服务:包括对正文、二进制数据、图像数据、及数字化声像数据的存储、访问和发送,典型应用:E-mail 5)目录服务:存储网络资源并且使其能被用户和应用程序访问的网络服务 6)应用服务:替网络用户运行软件,不仅允许计算机共享数据,还可以共享处理能力 18.网络的有机组成 1)计算机系统:是网络的基本模块,提供各种网络资源 2)数据通信系统:连接网络基本模块的桥梁,提供各种网络连接技术和信息交换技术 3)网络操作系统:网络的管理者,提供各种网络服务 高速网络技术比如光纤分布式数据接口(FDDI)、同步光纤网(SONET)、千兆位以太网、万兆位以太网、异步传输模式(ATM)、帧中继(FR)技术等。智能网络技术的目标是实现计算机网络的“操作智能化”和“服务智能化”。 如果const在*左边,const修饰值intconst*pi 如果const在*右边,const修饰指针int*constpi; 其实这种问题你可以这样看,const后面如果有*p之类的,就是p能改,*p不能改,也就是指针能改,指针的值不能改,intconst*p后面有*p,所以是*p不能改,int*constp是p不能改,*p能改~!其他的类似。 constint*p; intconst*q; int*constr=&i; 1,声明了一个指针p,它指向一个int型的常量,p可以再指向别的变量,但这个int型的值不能被改变 2,同上.3,声明了一个常指针p,它被一个int型变量的地址初始化,这个指针将不再允许指向别的变量,而这个int变量的值是可以改变的。 const修饰指针和引用的用法,对于初学C++的人直是讳莫如深,不知所云.一旦你了解了其用法,一切便不值一哂了.下面我为读者一一释疑: 大致说来其可分为三种情况:const修饰指针,const修饰引用,const修饰指针的引用.1.const修饰指针 const修饰指针又可分为三种情况: const修饰指针本身 const修饰指针所指的变量(或对象) const修饰指针本身和指针所指的变量(或对象) (1).const修饰指针本身 这种情形下,指针本身为常量,不可改变,任何修改指针本身的行为都是非法的.例如:constinta=1; constintb=2; inti=3; intj=4; int*constpi=&i;//ok,pi的类型为int*const,&i的类型为int*const int*constpi=&a;//error,pi的类型为int*const,&a的类型为constint*const pi=&j;//error,指针是常量,不可变 *pi=a;//ok,*pi并没有限定是常量,可变 由此看出,pi是常量,常量在初始化和赋值时,类型必须严格一致。也就是const修饰指针本身时,=号两边的变量类型必须严格一致,否则不能匹配。 (2).const修饰指针指向的变量(或对象) 此种情形下,通过间接引用指针不可改变变量的值,假设指针为p,则*p不可变,下面以例子说明: constint*pi=&a; //orintconst*pi=&a; //两者毫无二致,不过BS喜欢前者,这也没什么技术上的优劣之分,也就是说constint与intconst可以互换.建议大家熟 //悉这两种形式,为简洁便,以后统统用前者.//ok,const并不修饰指针本身,pi对赋值类型 //没要求,但pi是int*型指针,所以所赋的必须是个地址值。 constint*pi=&i;//ok,pi可赋值常量的地址,又可赋变量的地址 constint*pi1=&a; constint*pi=pi1;//ok *pi=j;//error,*pi不可变,不能更改指针的间接引用形式 pi=&j;//ok,pi可变 pi=&b;//ok,pi可变 pi++;//ok --pi;//ok 由此可见,pi是变量,可以赋值常量和变量的值,正如一个整型变量可赋整型数和整型变量一样.const修饰的不是指针本身,而是其间接引用,=号两边的类型不必严格匹配,如:constint*pi=&a;中,pi的类型为int*,而&a的类型为constint*const,只要其中含有int*就可以。又如:constint*pi=&j;中,pi的类型为int*,而&j的类型为int*const,它向pi赋值并无大碍。 (3)const修饰指针本身和指针所指的变量(或对象) 设有指针p,此种情形下,p和*p都不可变.举例如下: constint*constpi=&a; //orintconst*constpi=&a; //将constpi看作一体,就与(2)所述相同,只是要求pi必须为const,正如上所说,=号两边的类型不必严格匹配,但必须含有int*,&a的类型为constint*const,含有int*,所以可以赋值。constint*constpi=&i;//ok,&i类型为int*const,含有int*,可赋值。 constint*pi1=&j; constint*constpi=pi1;//ok,pi1类型为int* pi=&b;//error,pi不可变 pi=&j;//error,pi不可变 *pi=b;//error,*pi不可变 *pi=j;//error,*pi不可变 pi++;//error,pi不可变 ++i;//ok,=号右边的变量(或对象)与所修饰的变量无关 a--;//error,a为const 这种情况,跟以上两种情形有联系。对constint*constpi=&a;我们可以这样看:constint*(constpi)=&a;(仅仅是表达需要),将constpi看作一体,就与上述分类(2)符合。只要含有int*便可.2.const修饰引用 这种情况比较简单,没有象修饰指针那样繁复,因为引用和引用对象是一体的,所以引用被const修饰只有一种类型。 const修饰引用,引用本身不可变,但引用的变量(或对象)可以改变.例如: constint&ri=a;//orintconst&ri=a;ok,ri本身是常量,引用不区分类型 constint&ri=i;//ok,引用不区分类型 ri++;//error,ri为常量,不可变 i++;//ok,=右边的变量与引用无关 ri=b;//error,ri为常量 i=j;//ok,=右边的变量与引用无关 int&constri=i;//error,不存在这种形式,没有意义 3.const修饰指针的引用 引用只是个别名,这里与修饰指针类似,又分为三种情况: (1) 先给个例子: constint*pi=&a; constint*&ri=pi; //orintconst*&ri=pi; 引用是引用对象的别名,正因为如此,ri是pi的别名,所以ri的类型必须与pi完全一致才行。这里pi的类型为int*,ri的类型也为int*,赋值可行。若constint*&ri=&a;正不正确?分析一下就知晓。ri类型为int*,&a的类型则为constint*const不匹配。 constint*&ri=&i;//error,类型不匹配,一为int*,一为int*constri=&a;//ok ri=&i;//ok constint*pi1=&a; constint*pi2=&i; ri=pi1;//ok ri=pi2;//ok *ri=i;//error *ri=a;//error 注意这与1-(2)的区别.(2) 用例子说明: int*const&ri=&i; 去掉ri左边的&号,则为int*constri,因为ri是别名,故ri的类型应与赋值的数类型一致,ri类型为int*const,&i为int*const,可以这么做.int*const&ri=pi;//error,类型不合,一为int*const,一为int*int*const&ri=&a;//error,类型不合,一为int*const,一为constint*const (*ri)++;//ok i++;//ok ri=&i;//error 这种情况下,ri为常量,不可更改.(3) 用例子说明: constint*pi=&j; constint*const&ri=pi;//orintconst*const&ri=pi;ok constint*const&ri=&i;//ok ri是pi的别名,pi的类型应与ri一致。拿掉&,得constint*constri,把constri看作一体,很容易得出ri的类型信息,就象前面2-(3)所讨论的一样,可以得到赋给ri的只要含有类型int*即可。pi的类型为int*,&i的类型为int*const,可以这么做.constint*const&ri=&a;//ok ri++;//error *ri=6;//error 六年级上圆概念知识点总结 1.圆的定义:平面上的一种曲线图形。 2.画圆时圆规针尖所在的位置叫做圆心。圆心一般用字母O表示。它到圆上任意一点的距离都相等. 3.半径:连接圆心到圆上任意一点的线段叫做半径。半径一般用字母r表示。把圆规两脚分开,两脚之间的距离就是圆的半径。4.圆心确定圆的位置,半径确定圆的大小。 5.直径:通过圆心并且两端都在圆上的线段叫做直径。直径一般用字母d表示。6.在同一个圆里,所有的半径都相等,所有的直径都相等。7.在同一个圆里,有无数条半径,有无数条直径。 8.在同一个圆内,直径的长度是半径的2倍,半径的长度是直径的一半。用字母表示为: d=2r r =d 21用文字表示为:直径=半径×2 半径=直径÷2 9.圆的周长:围成圆的曲线的长度叫做圆的周长。 10.圆的周长总是直径的3倍多一些,圆的周长除以直径的商是一个固定的数,我们它叫做圆周率,用字母表示。圆周率是一个无限不循环小数。在计算时,取3.14。世界上第一个把圆周率算出来的人是我国的数学家祖冲之。 11.圆的周长公式:1.知道直径d:圆周长=×直径:C=d 2.知道半径r :圆周长=2××半径:C=2r 3.半圆的周长=圆的周长除以2+直径 12.知道圆的周长C求直径:d=C 知道圆的周长C求半径:r= C2 12、圆的面积:圆所占面积的大小叫圆的面积。13.求圆面积的公式:1.已知r时:S2.已知d时:Sr2 2d2 3.已知C时:先求出半径(r= C2),然后用第一条公式 或者直接用公式:SC2 215.在一个正方形里画一个最大的圆,圆的直径等于正方形的边长。(✿)16.在一个长方形里画一个最大的圆,圆的直径等于长方形的宽。(✿)17.一个环形,外圆的半径是R,内圆的半径是r(✿) 2S(Rr)它的面积是SRr 或 2218.半圆的周长等于圆的周长的一半加直径。 半圆的周长与圆周长的一半的区别在于,半圆有直径,而圆周长的一半没有直径。半圆的周长公式:C=d2+d 或 C=r+2r 圆周长的一半:C=d2 或 C=r 19.半圆面积=圆的面积2 公式为:S=r2 20.在同一个圆里,半径扩大或缩小多少倍,直径和周长也扩大或缩小相同的倍数。而面积扩大或缩小以上倍数的平方倍。 例如:在同一个圆里,半径扩大3倍,那么直径和周长就都扩大3倍,而面积扩大9倍。 21.当长方形,正方形,圆的周长相等时,圆的面积最大,长方形的面积最小 22.轴对称图形:如果一个图形沿着一条直线对折,两侧的图形能够完全重合,这个图形就是轴对称图形。折痕所在的这条直线叫做对称轴。23. 有1条对称轴的图形有:角、等腰三角形、等腰梯形、扇形、半圆。 有2条对称轴的图形是:长方形 有3条对称轴的图形是:等边三角形 有4条对称轴的图形是:正方形 有无数条对称轴的图形是:圆 29.直径所在的直线是圆的对称轴。(直径不出头,对称轴要出头)30.常用的3.14的倍数: 3.14×2=6.28 3.14×3=9.42 3.14×4=12.56 3.14×5=15.7 3.14×6=18.84 3.14×7=21.98 3.14×8=25.12 3.14×9=28.26 3.14×12=37.68 3.14×14=43.96 3.14×16=50.24 3.14×18=56.52 3.14×24=75.36 3.14×25=78.5 3.14×36=113.04 3.14×49=153.86 3.14×64=200.96 3.14×81=254.34 如何透彻理解C语言中指针的概念 强大的指针功能是C语言区别于众多高级语言的一个重要特征。C语言指针的功能强大,使用灵活多变,可以有效地表示复杂的数据结构、动态分配内存、高效地使用数组和字符串、使得调用函数时得到多个返回值。而它的应用远不限于此。初学者对于指针的概念总是感到无所适从,有时觉得“自己懂了,为什么编译器就是不懂呢”,常有茫然和无助的感觉。 学好指针的关键在于深入了解内存地址的空间可以理解为一个一维线性空间,内存的编址和寻址方法,以及指针在使用上的一些规定。事实上,指针就是方便我们对内存地址直接进行操作的,是为程序员服务的,我们只要抓住指针想要帮助我们解决什么问题这个核心,就可以轻松地理解它的工作原理。 什么是指针,指针有什么作用 指针就是指向一个特定内存地址的一个变量。简化了的内存空间模型是按照从0到某一个数(比如1048575=1M-1)的一维线性空间,其中的每一个数对应一个存储单元,即1个字节。指针有两个属性:指向性和偏移性。指向性指的是指针一定要有一个确定的指向,偏移性则是体现指针重要应用的方面,即指针可以按程序员的要求向前或向后偏移。 指针的应用往往与数组联系在一起,为了方便说明问题,不妨从数组开始解释指针的偏移。数组就是许多的变量,它的一个重要特征就是在内存空间中连续地存放,而且是按下标顺序存放。比如我们定义一个有100个变量的一维整型数组,它一定从内存的某一个存储单元开始按数组下标顺序存放,连续占用100*4=400字节。当我们定义一个数组时,系统就会自动为它分配一个指针,这个指针指向数组的首地址。(在本文剩余部分的论述中,不加区分地使用“指向数组的首地址”与“指向数组的第一个元素”这两种说法,事实上这两种说法也是一致的。) 为了让系统了解每一次指针偏移的单位,也为了方便程序员进行指针偏移(让程序员记住一个整形变量占用4字节,一个字符型变量占用1字节„„等等是很麻烦的),不用每次去计算要偏移多少个字节,C语言引入了指针的基类型的概念。基类型的作用就是让系统了解某个指针每次偏移的字节数。比如,对于一个字符型指针,它每次偏移(比如ptr=ptr+1)所起到的作用就是让指针偏移1字节;而对于一个整型指针,它每次偏移就应该是4字节。这样操作数组时就带来了方便。比如对于一个指向某个整型数组起始存储单元(称为首地址)的指针ptr,ptr=ptr+1就表示将该指针指向这个数组的下一个元素的存储单元,即向后移动4字节,而不仅仅是移动一个存储单元(即移动1字节)。 &()、*()、和[ ]运算符的意义 在本文中,将&()、*()和[ ]都看成是运算符。这样可以方便理解这三个概念。简单地说,&()将某个标识符(比如变量)转化为其在内存空间中的地址,而*()是产生一个对应于某个地址的标识符,[ ]就更复杂一点,ptr[i]表示将ptr这个指针虚拟地按其基类型进行i个单位的后移,再进行*(ptr)运算。但这是一个虚拟的后移,即ptr[i]并不改变ptr的指向,只是将其后移i个单位并取*()运算的结果算出来了而已。要改变指针的指向,我们只能通过类似于ptr=ptr+i这样的语句来实现。 实际中,我们往往不愿意经常改变指针的指向,因为指针的移动虽然是自由的,但移动后往往会“移不回来”,因为我们可能无法清楚地确定指针的偏移量。后面我们将看到,对于用指针来表示的数组,其元素的引用和赋值是完全可以不用改变指向这个数组的首地址的指针指向的,而一旦要改变这个指针的指向,问题就会变得复杂一些,我们在后面有一个关于程序的命令行参数处理例子专门介绍这个问题。 指针类型和系统自动分配的指针 指针可以指向几乎所有我们感兴趣的程序设计要素:函数、数组、结构体、链表节点等等。其中不同函数间往往并不存在严格的线性关系。链表节点可以根据算法需要在逻辑上(或物理上)不按线性连续存储。但数组、结构体的共同特征就是它们在物理上都是线性连续存储的。只要指针指向了它们的首地址,就可以通过简单的偏移来访问各个它们的元素。指针的偏移性在这两种数据结构中发挥着至关重要的作用。这时,我们再回想基类型的定义目的,就会有更深层次的认识了。对于一个数组或结构体,它的基类型长度应当是其元素的长度(这里的长度即指在内存空间中占用的字节数),而不再限于定义为某种简单数据类型的长度。 在我们定义数组和函数时,系统都会为其自动分配一个指向其首地址的指针。其中,指针在数组中的应用是最频繁的,也是最基础的。对于一个数组,其名称就是一个指针变量,亦即假如我们定义“int a[10];”的同时就定义了“int *a=a;”(这只是为了说明问题,这样的语句显然是不合法的)。 数组应用中典型的二级指针 设定一个指向指针的指针,即设定一个二级指针。一般认为,指针不宜超过二级,否则会大大增加逻辑错误出现的可能性。因此,下面详细解释数组二级指针的实现方法及原理。在此基础上理解指针的其它相关概念是非常简单的。 刚才一直提及指针的基类型,以及对它的正确理解方法。请在阅读下面论述的过程中不断地考虑“我们所提到的每个指针的基类型是什么”这个问题。 首先我们先要对二维数组进行重新定义,即将一个M*N的二维数组定义为有M个元素的一维数组,它的每个元素都是一个具有N个元素的一维数组。这种理解方式对于以前学习过Basic、Pascal等语言的程序员来说比较难以接受,因为它们更容易直观地将其理解为一张二维表。事实上,二维数组在内存中的线性存储是这样实现的:把每一行看作它的一个元素,然后按照一维数组的按下标顺序排列的原则以每一行为单位进行排列。而对于每一行,也还是按照一维数组按下标顺序排列的原则进行排列。也就是说,我们可以按行优先的方式将数组的数字逐个“填入”内存空间。或者也可以说,多维数组在内存中的排列方式是递归定义的。 既然如此,当我们定义 “int a[10][10];”的时候,a是什么样的指针呢?是的,a就是一个二级指针。它的基类型是有10个元素的一维数组,不再是整型变量了。它所指向的是一维数组指针(第一行的数组指针)。当我们执行a=a+1的时候,a将指向二维数组第二行的数组指针,而不是第一行的第二个元素,因为基类型的长度决定了a+1跨越了一整行。 因此,我们要得到数组a的(i,j)位置上的元素的值,应该按照下面的步骤来进行: 1、a+i,这表示将a指针移到第i行的首地址。 2、*(a+i),这表示将第i行的首地址转化为第i行的标识符,前面已经述及,*()运算符的作用就是将地址转化为标识符。但*(a+i)不是第i行的第一个元素而是一个指针,这个指针的基类型已经变成了整型变量,不再是有10个元素的一维数组了。或许你要说,第i行的首地址不就是第i行第一个元素的地址吗?那么*(a+i)不就是第i行第一个元素的值了?首先,我们可以肯定*(a+i)不是第i行第一个元素的值,但第i行的首地址的确就是第i行第一个元素的地址。前面对*()运算符的说明只是一个表面现象,下面的说法可以辅助你理解*()运算符的真正本质:*()将指针还原为其所指,而不是简单地将地址变成这个地址所存储的值。*()将地址变成这个地址所存储的值这样的说法只对一级指针是正确的。对于二级指针,*()只是将二级指针还原为其所指,即还原为一级指针。物理上“第i行的首地址同时就是第i行第一个元素的地址”这一事实,是容易导致混淆的根本原因。但只我们要从逻辑的角度出发,就可以较为轻松地理解这个问题。 3、*(a+i)+j,这表示将一级指针向后偏移j个单位,要注意*(a+i)这个指针已经是一个以整型变量为基类型的指针了。这时*(a+i)+j是一个偏移后的一级指针,它的值是a[i][j]元素的地址,亦即它所指的就是a[i][j]元素。 4、*(*(a+i)+j),将一级指针还原为其所指,即得到了a[i][j]元素的值。 理解了以上的概念,将会对指针有全新的认识,而对于二级以上的指针和其它类型的指针,原理也都是类似的。对指针的更深入理解只有在编程的实践中得到。从算法设计的角度来看,使用指针对数组进行遍历等操作可降低时间复杂度,因为指针按照基类型偏移1个单位的效率很高。 一维指针数组中的二级指针 透彻地理解下面这段程序对于进一步理解指针的原理是很有裨益的。下面是一个将系统分配的指针(即数组名指针)进行偏移的例子: main(int argc,char *argv[]){ while(argc>1){ ++argv;printf(“%sn”,*argv);--argc;} } 粗略地看,不难发现这个程序的作用就是将其命令行参数(不包括第一个程序路径及文件名参数)逐个输出。但其中却用到了二级指针,究竟是也不是,我们从细节入手分析。 首先,argv是一个指针数组,它的每个元素所指向的是每个命令行参数字符串的首地址。比如,我们的参数是“abc def”,那么argv[1]和argv[2]所指向的就分别是字符串“abc”和“def”的首地址(注意argv[0]指向的是程序路径及文件名字符串的首地址)。 那么,第四行的++argv是什么意思呢?我们知道,一个数组的名称就是一个指针,在没有被改动的情况下,它指向这个数组的首地址。++argv的作用就是将argv这个指针(数组名)按照其基类型宽度向后移动一个单位,如果原来argv所指向的是argv这个数组的首地址,那么执行以后它将指向其第二个元素(即argv[1])。也就是说,这个程序改动了数组名(本身也就是一个指针)的指向,不断将其后移。 理解到这里,你可能已经初步感到问题并不像看上去那么简单了。下面的一句“printf(“%sn”,*argv)”更是有意义了。你会不会觉得奇怪呢?因为printf(“%s”,ptr)或者puts(ptr)所需要的参数都是指针。既然argv已经是指针,又为什么要在前面再加上一个“*”运算符呢?原因如下:argv确实是指针,但它所指的argv这个数组自己的某一个元素(因为我们已经分析过,argv这个指针是从自己的第一个元素argv[0]的地址开始不断地后移的)。这看起来和一个指向字符串的指针char *ptr=”string content”是类似的。但我们在输出ptr指针所指的字符串时是使用printf(“%s”,ptr)而不是printf(“%s”,*ptr)来输出的。那如果我们的这句话是“printf(“%sn”,argv)”会怎样呢?程序运行后得到的是一堆乱码。那这堆乱码是什么呢?这堆乱码实际上是argv这个在不断向后移动的指针的所指,即argv数组的元素的地址(如&argv[1],&argv[2]等),也即指向某个命令行参数字符串的首地址的指针的地址。如果能理解到这一点,就会知道为什么我们说这个短短的程序中用到了二级指针了。既然argv只是argv这个数组的某个元素的地址,那么加上一个“*”运算符对其进行间接访问,即可得到argv数组的元素的值,这个值是一个指针,它指向某个命令行参数字符串的首地址。因此这个语句的意义也就大白于天下了。事实上,这个语句还可以等价地写为“printf(“%sn”,argv[0])”,因为对于一个指针来说,*(ptr)运算与ptr[0]运算是无条件等价的。不要认为这个语句等价为“printf(“%sn”,argv[i])”(i是循环变量),因为argv这个数组名指针本身已经在后移了,不能用i再次进行后移。 虽然理解起来显得复杂,但程序本身却短小精悍,可以作为处理命令行参数的一般方法来使用。这也从一个侧面证明了指针可以大大简化某些程序设计过程。 由此我们可以总结出,所有指针数组中都包含了二级指针。第一次由指针数组名指向其元素,第二次由其元素再次指向其它的程序设计要素(本例中是字符串的首地址)。 使用字符串常量的一个常见错误分析 这个部分留给具有一定编程经验的读者。如果要使用C语言编写复杂应用程序,下面的知识是必须的。 在指针应用中容易导致错误的一种常见行为就是对字符串常量进行更改。程序员在对字符串常量进行引用、修改时,一定要特别注意C语言对于字符串常量的处理方法。否则,容易导致十分隐蔽的错误。这些错误往往集中在熟悉Pascal等编程语言的程序员身上,并在OOP编程中出现。 当程序中包含了几个字符串常量时,这些常量是在程序入口一次性分配内存的,而不是在每次执行某个函数时开辟一块新的内存区域来存放的。下面用一个具体的错误例子来说明这个问题。 这是一个C++ Builder 6下的例子。某个窗体的代码中包含下面两个事件函数: void __fastcall TfrmMain::btnSearchClick(TObject *Sender){ nmuMain->InputString = edtKeyword->Text;char* query = new char[ nmuMain->Encode.Length()+ 1 ];strcpy(query, nmuMain->Encode.c_str());HTTPGet(strcat(“http://www.xiexiebang.com&q=”,query));} void __fastcall TfrmMain::nmhMainSuccess(CmdType Cmd){ frmMain->pnlStatus->Caption = “Successfully retrieved data from Google.”;AddResults();} 在btnSearchClick事件中,请注意strcat(str1,str2)这个函数。它的作用是将str2连接到str1的后面。这将导致str1变长。这会导致两种后果: 第一,当用户再次点击btnSearch时,HTTPGet()函数的参数将变成“http://www.xiexiebang.com&q=”和第一次用户提供query,以及第二次用户提供的query。为什么呢?因为字符串常量“http://www.xiexiebang.com&q=”变长了,它已经包含了第一次用户提供的query。 第二,第二个事件函数中的“Successfully retrieved data from Google.”将被替换成用户输入的query。这又是为什么呢?前已述及,两个字符串常量是在程序入口一次性分配内存的。它们是在内存中连续存放的。因此第一个字符串常量变长自然就替换了后面字符串常量。如果没有意识到这一点,很可能导致难以预料的严重系统错误。事实上,C语言对字符串的起始和结束的判定严格遵守下面的简单规律:根据字符串名称(是一个指针)指向的地址来确定字符串的起始,根据“ ”转义符来确定字符串的中止。 为了修正上面的错误,应该避免对字符串常量进行修改。即将第一个事件函数改为: void __fastcall TfrmMain::btnSearchClick(TObject *Sender){ nmuMain->InputString = edtKeyword->Text;char* query = new char[ nmuMain->Encode.Length()+ 1 ];char searchstr[41];char* original_searchstr = “http://www.xiexiebang.com&q=”;strcpy(searchstr, original_searchstr);strcpy(query, nmuMain->Encode.c_str());HTTPGet(strcat(searchstr,query));} 此外,在OOP编程中,应该注意两个有关字符串的问题。第一,如果采用 char* str = new char[ length ];来分配内存空间,虽然可以实现根据带有变量的表达式length“动态”分配内存空间的效果,比如length=i+j-1;但这种分配也是一次性的,即下一次执行该语句时,不会再次分配新的内存区域。第二,C++ Builder从Pascal的VCL中引入了AnsiString类型,这是一种指针类型。应注意绝大部分C++ Builder的函数中如果要求AnsiString作参数(不论是要求地址还是指针),都应提供字符串名称来作参数。典型的例子包括str.pos(str1),ShowMessage(str),以及上面的例子中出现的几种情况。 最后,所有C++ Builder程序员不应忘记VCL是用Pascal语言编写的。遇到一些难以解决或解释的问题时,不妨从Pascal语言的编程思想入手,一般很快就能想到解决办法(绝大部分Object Pascal函数都有对应的C语言版本)。这种方法对于学过Delphi的程序员来说是特别有用的。 以上只是对指针基本概念的简单论述,旨在让初学者能透彻地理解指针的概念。限于作者水平,不妥之处在所难免,请各位读者不吝赐教。只有学习好指针的相关概念,才能真正发挥C语言的强大功能,编写出质量上乘的系统软件。而对于指针的使用技巧,只能在编程过程中日积月累,经历从量变到质变的过程。第二篇:计算机网络概念知识点总结
第三篇:关于指针的一些总结
第四篇:六年级上圆概念知识点总结
第五篇:如何透彻理解C语言中指针的概念