C语言讲义(day03-04)_第1页
C语言讲义(day03-04)_第2页
免费预览已结束,剩余6页可下载查看

下载本文档

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

文档简介

个人收集整理-ZQC语言讲义(day03-04)语言讲义.数组数组的定义数组属于构造数据类型。数组分为数值数组、字符数组、指针数组、结构体数组等。数组的引用,方便,数组下标表达式不仅可以表示存储单元中的值,也可以表示存储单元本身,也就是说可以做左值。 *()链表:带头结点和不带头结点?数组必须逐个元素引用,而不能整体引用下标引用符,优先级是最高的,并且具有右结合性种后缀运算符:后缀 后缀 . ()种单目运算符:前缀 前缀 !语言中后缀运算符的优先级最高,单目运算符的优先级仅次于后缀运算符,比其它运算符的优先级都高。数组下标也可以是表达式,但表达式的值必须是整型的。变量?使用数组下标不能超出数组的长度范围,这一点在使用变量做数组下标时尤其要注意。编译器并不检查访问越界错误,编译时能顺利通过,所以属于运行时错误,但有时这种错误很隐蔽,发生访问越界时程序可能并不会立即崩溃,而执行到后面某个正确的语句时却有可能突然崩溃。传说中段错误b5E2R。b5E2R。数组的初始化种方式:定义时整体初始化定义时部分初始化数组全部赋值数组和结构体虽然很多相似的地方,但有显著的不同:数组不能互相赋值或初始化。对于数组类型有一条特殊规则:数组类型做右值使用时,自动转换成指向数组首元素的指针。数组应用实例:生成并打印随机数;.伪随机数(),看起来 * ( ). * () ;随机数真正的随机数计算机安全取余模运算系统编程 . 定义一个常量 命令 不仅用于定义常量,也可以定义更复杂的语法结构,称为宏定义。其次,定义在预处理阶段处理的,而枚举是在编译阶段处理的。p1Ean。p1Ean。数组应用实例:直方图产生随机数 和 的用法练习:1. 补完直方图程序的(),以可视化的形式打印直方图。2. 定义一个数组,编程打印它的全排列。.字符串字符串可以看作是一个数组,它的每个元素是字符型的。注意每个字符串末尾都有一个字符“”做结束符,这里的是码的八进制的表示,也就是码为的字符,所以字符串也称为“以结尾的字符串”DXDiT。DXDiT。 ;编译错误,说明字符串字面值是只读的,不允许修改。字符串字面值还有一点和数组名类似,做右值使用时自动转换成指向首元素的指针。数组可以像结构体一样初始化,如果是字符数组,也可以用一个字符串字面值初始化如果用于初始化字符串字面值比数组还长,包含指定的长度,不包含字符,这种情况编译器会给出警告。最好如下:RTCrp。RTCrp。字符串处理函数练习:整形数组找到最大的数值,并且显示其位置;多维数组数组可以嵌套,结构体也可以嵌套行主二维数组的逻辑顺序二维数组的物理二维数组初始化分段赋值 按行连续赋值要善于使用二维数组;不用语句例如:简单游戏机器人 矩阵计算 云计算.指针回忆:堆栈栈顶指针队列队头指针和队尾指针上面本质是个整数,是数组的索引间接寻址直接寻址变化简单地说,指针就是地址。由于现在大多数计算机是位的,也就是说地址的字宽是位的,因此指针也就是位的。可以看到,由于计算机内存的地址都是统一的宽度,而以内存地址作为变量地址的指针也就都是位宽度的。5PCzV。5PCzV。虽然所有的指针变量都是等长的,但仍然需要定义指针的类型说明符,因为对指针变量的其他操作如(加,减)都涉及指针所指向变量的数据宽度。一个指针变量只能指向同类型的变量。jLBHr。jLBHr。注意:所有数据类型的指针(整型、字符型、数组、结构体等)在位机上都是位的。变量地址是该变量独一无二的标示,只要知道这些地址一定找到该变量,在语言中,可以将这些地址(指针)赋给专门用于存储地址的变量,这些变量就称为指针变量。xHAQX。xHAQX。指针变量的赋值未经赋值的指针变量不能随便使用,否则造成程序运行错误。指针变量的值只能是变量的地址,不能是其他数据。在语言中,变量的地址是由编译器系统分配的,用户不知道变量的具体位置,个人认为也无需知道全局变量只能用常量表达式来初始化*在声明时中表示声明一个指针类型,用在表达式中是间接寻址运算符,类似于 ;*和互为逆运算,运算符的操作数必须是左值,因为左值才表示一个内存单元,才会有地址,运算结果是指针类型。*运算符的操作数必须是指针类型,运算结果可以做左值。LDAYt。LDAYt。指针之间可以互相赋值,也可以用一个指针初始化另一个指针(同一个类型)。代码显示的结果表明:若把一个变量的地址赋给指针意味着指针所指向的内存单元实际上就是存储该变量的内存单元。因此,无论改变指针所指向的内存单元的内容还是直接直接改变变量的内容,都会有相同的效果。Zzz6Z。Zzz6Z。函数是用于动态分配内存的,它可以分配指定大小的内存区域,通常用于指针的初始化,其函数原型为“ *( );”该函数返回已分配的内存区域首地址。若该函数的返回值为,则说明内存分配出错。由于分配的内存无法由程序自动回收,因此在使用完后必须调用函数将分配的内存释放,否则出现内存泄露的问题。dvzfv。dvzfv。指针 标准库中: ( *)上一句实际是整型的强制转型成 *指针,这个指针指向地址,称为空指针操作系统不会把任何数据保存到地址及其附近,也不会把地址的页面映射到物理内存,所以对地址访问,一定会引起段错误。rqyn1。rqyn1。 语言标准定义了一个指针,其值为,在实际编程中,指针的使用是非常普遍的,因为它可以用来表明一个指针目前并未指向任何对象。Emxvx。Emxvx。在初始化时,指针设置为,好的习惯。“野指针”对指针进行间接引用操作是非法的,因为它还没有指向任何对象。因此,在对指针进行间接引用前,应该先判断该指针是否为,这样才不会出现错误。SixE2。SixE2。由于指针是标量类型,因此可以做逻辑与、或、非运算的操作数和、的控制表达式,例如 () 非空指针6ewMy。6ewMy。 空指针 *类型编程时常需要一种通用指针,常用于函数传参数和传返回值。注意:只能定义 *类型的指针,而不能定义类型的变量思考:为什么要用定义类型名,而不用定义类型名? *; *这两种定义用起来的有区别么?指针类型的参数和返回值. 指针和数组数组的指针指的是数组的首地址。显然,数组中第一个元素的地址就是整个数组的首地址。在语言中,规定使用数组名来代表该数组的起始地址。kavU4。kavU4。 等价的!在右值时候,自动转换成指向首元素的指针等价的 语言允许数组下标是负数 包含两个运算符,取地址符和下标运算符。右结合性数组名虽然是一个指针,代表该数组的起始地址,但不能将一个指针赋给一个数组,为什么呢?数组和指针很大的区别:数组是一个具有固定数量的数据元素的集合。数组在内存中的位置在程序的运行中是无法动态改变的。因此,数组名可以理解成一种指针常量,它可以在运算中作为指针参与,但不允许被赋值。y6v3A。y6v3A。下标的引用*()取指针后面第二个对象的内容指针的一次相加是以其所指向对象的数据宽度为单位的(不是以字节为单位)。也就是说,对于指向整型变量的指针,加操作就相当于向后移动个字节;对于指向字符型变量的的指针,加操作就相当于向后移动个字节。M2ub6。M2ub6。*(数组名 ) 数组名 在语言中指针的效率往往高于数组下标,因此,编译器对程序中数组下标的操作全部转换为对指针的偏移量的操作。0YujC。0YujC。表格如代码测试数组和指针异同点相同点在语言中,指针和数组有很大通用性。规则:表达式中的数组名被编译器当作指向该数组第一个元素的指针。规则:下标总是与指针的偏移量相同。规则:在函数参数的声明中,数组名被编译器当作指向该数组第一个元素的指针。规则表明的是如果数组在函数中实现,则编译器将数组按照指针的方式处理。效率高所有非数组形式的数据实参均以值传递,函数不能修改实参的值,而只能修改形参的值。如果也采用值传递,时间和空间开销太大值传递地址传递(引用传递)对象在语言中,采用的是将数组的首地址传给函数的形参,在被调函数中再对数组进行操作。在函数定义或声明中可以不用给出数组的维数。eUts8。eUts8。不同点:指针使用中有一个特殊情况,当指针指向一个字符串常量。 * “ ”;这时,指针所指向的对象被定义为只读的。用户通过指针修改这个字符串的值,程序就会出现错误。不可以对除字符串常量以外类型的指针按以上方法初始化,如“ * ;”但是“ * ;”正确的。指向数组的指针 *; 等价于 *; ; 代表 * 类型, 则是由这种类型的元素组成的数组。 (*); 等价于 *; 代表由个组成的数组类型,则是指向这种类型的指针。比*更高的优先级,如果先和*号结合则表示是一个指针,如果先和括号结合则表示是一个数组。指向数组的指针 ; (*) ;是一个数组,在这个表达式中,数组类型做左值,取整个数组的首地址赋给指针。注意,表示数组的首元素的首地址,而表示数组的首地址,虽然这两个地址的数值相同,但这两个表达式的类型是两种不同的指针类型,前者的类型是 *,后者的类型是 (*)。sQsAE。sQsAE。*表示指向的数组,*做右值时候也会自动转换成指向数组的首元素的指针,所以取数组元素也可以用表达式(*)。GMsIa。GMsIa。注意:*可以写成,所以(*)这个表达式可以写成就像一个二维数组的名字。指向数组的指针和二维数组关系; ; 和 (*); 类似于 ;和 *;之间的关系:是一种元素组成的数组,则是指向这种元素的指针,所以,如果指向的首元素:TIrRG。TIrRG。 ; (*) ;则和取的是同一个元素,唯一比原来复杂的地方在于元素的类型是 数组,而不是基本类型。这样,我们可以把当成二维数组名来使用,和取的也是同一个元素,而且比用起来灵活,数组类型不支持赋值、自增等运算,而指针可以支持,使跳过一行,指向首地址。7EqZc。7EqZc。多维数组确定指针偏移量“”所代表的单位是通过“”之前的元素单位来定的,在二维数组中,当偏移量前得元素单位为整个数组时,偏移值单位为行;当偏移量前的元素单位为行时,偏移值单位为行中的元素。lzq7I。lzq7I。在多维数组中,采用降维处理。在实际使用中,常常使用二维数组就足够了。多维导致程序可读性及维护难度大。指针与 *; *; 是一个指向 型的指针,所指向的内存单元不可改写,(*) 非法,可以 * ; 是指向 型的指针,*可以改变,但本身不可改变 * ; 是指向 型的指针,* 和本身都不允许改写 ; * ;指向非变量的指针可以隐式转换成指向变量的指针 ; * ;编译报错误。使用限定符:1) 给读代码的人传达了非常有用的信息。2) 尽可能多使用限定符,把不改变的都声明成只读的,这样可以依靠遍编译器检查程序中的,防止意外改写数据。3) 对编译器优化是一个有用的提示,编译器也许会把变量优化。函数原型函数的原型第一个参数就是 *型,可以把 *或 *指针传给它用指针来处理字符串语言中的字符串是通过字符数组来存储的,而指向字符串的指针的含义是指针变量的值是字符串的首地址,即指针指向第一个字符。zvpge。zvpge。指针数组当数组中的每个元素都是指针时,就引出了指针数组。每个元素是同一类型的指针。 指向指针的指针数据类型 *变量名结构体数组和结构体指针结构体数组就是具有相同结构体类型的变量的集合。当结构

温馨提示

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

最新文档

评论

0/150

提交评论