版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、C语言程序设计 主讲教师:崔玲玲 计算机与通信工程学院 电话QQ群:15851984,第8章 地址和指针,8.1 地址与指针的概念,程序中: int i=10; float k=5.6;,内存中每个字节有一个编号-地址,10,5.6,1.地址的概念,指针,变量的内容,变量的地址,2.指针的概念,变量的地址称为指针。 或者说指针就是地址。,例 i=3; -直接访问,2000,3,3. 直接访问,通过变量名直接使用变量数据。,4. 间接访问,定义一个变量p,存放i的地址,通过p访问i。,5.指针变量的概念,专门用来存放指针的一类变量,专门用来存放变量地址的变量,指针变量,
2、变量,地址,内容,i,2000,3,P,2004,2000,指向,8.2、指针变量的定义和使用,一般定义格式: 数据类型 *指针变量名; 如: int *p ; float *q1,*q2;, 指针定义中,“*”号不能省略,它是指针说明符。,1. 指针变量的定义,指针定义说明:, 允许指针变量和其他变量在一个语句中定义。,int m,n,*p,*q;,指针变量所指向的变量的类型。, 指针变量的初始化 例如: int m=196,*p= p=,3. 指针运算符, p=,4. 指针变量的应用,存内容:*p=100;,例7-1 指针运算举例。 main() int a,b; int *p1,*p2;
3、 a=100; b=10; p1= t=x; x=y; y=t; ,void main() int a,b; scanf(%d%d, ,例7-4:分析下列程序的输出结果。,#include void swap(int *p1,int *p2) int temp; temp=*p1; *p1=*p2; *p2=temp; ,void main() int a,b; scanf(%d%d, ,指针变量作形参,变量地址作实参, ,void main() int a,b,c; sub(10,5, ,第九章 数组,数组概念 计算机处理数据时,经常出现数据是按某种有序的形式进行组织的情况。例如: 按学号排
4、列的成绩表; 按字母顺序排列是字母表; 这些数据具有共同的特征: (1)都是由若干个分量组成的。 (2)数据的所有分量都是同一类型。 (3)这些分量都是按一定的顺序排列的。 按序排列的具有相同类型的变量的集合称为数组。,9.1 一维数组,1.一维数组的定义,(1)定义格式: 数据类型 数组名数组长度,(2)说明:,数组的数据类型就是数组元素的数据类型。,数组长度:是数组能够包含的数组元素的个数,通常用一个整数值表示,也可以是常量表达式,但它不允许是包括变量的表达式。,int a3+5; float b2*3;,int n=10; float an;,例如:int a10; float b5;,
5、 为数组标志。,只能逐个使用数组元素,而不能一次使用整个数组。数组元素的一般表示形式如下:数组名下标 下标就是数组元素的序号,可以是一个整型常量,也可以是整型表达式。,C语言规定,数组元素的下标从0开始,当数组长度为n时,最末元素的下标是n-1。,如定义int a10; 其元素为:a0,a1,a2, a9,格式:数据类型 数组名数组长度=数组元素值表 例如:int a6=10,20,30,40,50,60; float b5=12.5,23.67,3.5,6.8,1.0;,2. 一维数组的初始化,(1)全部元素的初始化,所谓数组的初始化,就是指在定义数组的同时对数组的各个元素赋初值。通常有两种
6、情况,即全部元素的初始化和部分元素的初始化。,例如:int b10=1 , 2 , 3 ;,(2)部分元素的初始化,说明:当对全部数组元素初始化时,数组长度允许省略。,注意:当对部分数组元素初始化时,数据由前往后依次分配;,b0=1, b1=2, b2=3,而且数组长度不允许省略; 其余元素的初值为0。,int a =10,20,30,40,50,60; float b =12.5,23.67,3.5,6.8,1.0;,3. 一维数组的存储,任何一个一维数组在内存中都占用一段连续的空间,依次存储它的各元素的值。元素占用的字节数由数组的数据类型决定。,数组所占总字节数=数组长度数据类型所占字节数
7、,例如:int a6=10,20,30,40,50,60;,返回,4. 一维数组的应用 例9-1 分析下列程序的输出结果 #include void main() int a5,i; for(i=0;i5;i+) ai=i; for(i=0;i5;i+) printf(%d ,ai); ,scanf(%d,功能:从键盘输入5个数,并按照输入顺序输出。,从键盘输入10个整数,然后按照与输入相反的顺序依次将其输出。,一维数组a10的输入输出: 利用循环语句实现。 for(i=0;i10;i+) scanf(“%d”,例9-2 向数组输入10个整数,然后通过相邻元素比较交换的方法,将最大值移到数组最
8、后,然后输出该数组。,19,7,21,6,25,8,17,30,11,10,例9-3 用一维数组生成Fibonacci数列的前20项,并输出。,Fibonacci数列: 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1587 2584 4181 6765 ,int a20;,9.2、一维数组与指针,1.数组名就是指向此数组第一个元素的指针(首地址),int a6=10,20,30,40,50,60; int *p; p=a;,2.指针p指向第i个元素,3.数组元素的下标在内部实现时,统一按照“基地址+位移”的方式处理。,p= for(i=0;i1
9、0;i+) ai=ai*10; ,void main() int b10=0,1,2,3,4,5,6,7,8,9; int i; void add1(int a10); add1(b); for(i=0;i10;i+) printf(“%d ”,bi); ,返回,0,10,20,30,40,50,60,70,80,90,例9-7: 设计一个一维数组的输入输出函数input()函数和output()函数,并调用它实现数组的输入输出。,返回,为了提高函数的通用性,C语言允许在对形参数组定义时不指定数组的长度,而仅给出类型,数组名和一对方括号,以便允许同一函数可以根据需要来处理不同长度的数组。为了使
10、程序能够了解当前处理的数组的实际长度,往往需要用另一个参数来表示数组的长度,设计数组输入函数input()实现数组输入,设计数组输出函数output()实现数组输出。函数原型: void input(int,int ) void output(int ,int ),例9-8: 设计一个对一维数组排序的sort()函数, 并调用它实现数组排序。,返回,1问题分析与算法设计 设计排序函数sort(),排序算法冒泡排序法、选择排序法。 sort()函数原型 void sort(int,int ) 设计数组输入函数input()实现数组输入,设计数组输出函数output()实现数组输出。函数原型: v
11、oid input(int,int ) void output(int ,int ) 设计主函数mian(),在其中定义数组data。 调用input()函数建立data数组。 调用output()函数输出data数组。 调用sort()函数对data数组排序。 调用output()函数输出排序后的结果。,冒泡排序的过程如下: 对于给定的待排序数据,从头开始,依次对相邻的两个数据进行两两比较,当前者大时,两数交换位置,直到比较完最后一个数据,此时,这些数据的最大值处于最末位置。这称为一趟比较。 然后对其余数据重复这种比较过程,直到排序结束。 对N个数据的数列,需进行N-1趟排序操作。 设有一组
12、关键字序列为(49,38,65,97,76,13,27,51),写出采用冒泡排序的每趟的排序结果。,返回,初始关键字,49,38,65,97,76,13,27,49,38,49,76,97,13,97,27,97,49,97,第一趟排序后,38,49,65,76,13,27,49,97,38,49,49,65,65,76,13,76,27,76,49,76,第二趟排序后,38,49,65,13,27,49,76,97,38,49,49,65,13,65,27,65,49,65,第三趟排序后,38,49,13,27,49,65,76,97,38,49,13,49,49,27,49,49,第四趟排
13、序后,38,13,27,49,49,65,76,97,13,38,38,27,38,49,第五趟排序后,13,27,38,49,49,65,76,97,27,13,27,38,13,38,27,第六趟排序后,选择排序的过程如下: 第一趟从所有的n个记录中,通过顺序比较各关键字的值,选取关键字值最小的记录与第一个记录交换;第二趟从剩余的n-1个记录中选取关键字值最小的记录与第二个记录交换:依次类推,第i趟排序是从剩余的n-i+1个记录中选取关键字值最小的记录,与第i个记录交换:经过n-1趟排序后,整个序列就成为有序序列。 设有一组关键字序列为(49,38,65,97,76,13,27,51),写
14、出采用冒泡排序的每趟的排序结果。,返回,49,13,13,49,38,27,27,38,65,38,38,65,97,49,49,97,76,49,49,76,97,65,65,97,97,76,76,97,(1)定义格式: 数据类型 数组名表达式1表达式2,9.5、二维数组的定义和引用,1.二维数组的定义,(2)说明:,例如:int a34; float b53;,二维数组数据的排列通常具有如下形式:,横向的每一组数称为数组的一行, 纵向的每一组数称为数组的一列, 要定义二维数组,除要说明它的元素的数据类型、数组名外,还必须说明数组的行数和列数。,行数,列数, 二维数组数据类型与一维数组相同
15、。, 表达式1定义行数,表达式2定义列数,规定同一维数组。, 元素的一般表示形式如下:数组名下标1下标2 下标都从0开始编号 。, m行n列的二维数组具有mn个元素,通常也称为mn数组。,举例, mn的二维数组,可以看成是有m个元素的一维数组,其中每一个数组元素又是一个一维数组。如二维数组a34,可以视为包含a0、a1 、a2三个元素的一维数组,而a0、a1 、a2又是各包含四个元素的一维数组。,int a34;,a,a0,a1,a2,b,一 维 数 组 名,行 数 组 元 素,b,b,b,b,int a34;,数组a,行数组元素,列元素,a00,a01,a02,a03,a10,a11,a12
16、,a13,a20,a21,a22,a23,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,广义一维数组,2.二维数组的存储,在内存中按行逐列存放,二维数组实际上仍然是一个一维数组: 广义一维数组,3. 二维数组的初始化,(1)分行初始化,二维数组的初始化,就是在定义二维数组的同时,为数组元素赋初值。 二维数组有多种初始化形式。,(2)按行逐列初始化,按行初始化的思想,是把二维数组的一行当作一个一维数组对待,每行提供一个独立的数据集合。 例如:int a23= 1 , 2 , 3 , 4 , 5 , 6 ;,按行初始化时,也可以只对二维数组的部分元
17、素初始化。 例如:int a23= 1 , 2 , 4 ;,按行逐列初始化,是把提供的初始化数据,按照逐行逐列的顺序依次赋给对应的数组元素。 例如:int b32= 10,20,30,40,50,60;,按行逐列初始化,也可以只对部分数组元素初始化。 例如:int b32= 10,20,30;,(3)初始化时,二维数组的行数定义部分允许省略,例如:int a 4= 1,2 , 1,2,3 ; int b 3=1,2,3,4,5,6,7,8,9;,1 2 3 4 5 6,1 2 0 4 0 0,10 20 30 40 50 60,10 20 30 0 0 0,1 2 0 0 1 2 3 0,1
18、2 3 4 5 6 7 8 9,返回,例9-9:二维数组的输入与输出。,#include void main() int a34; int i , j ; for( i=0 ; i3 ; i+) for( j=0 ; j4 ; j+) scanf( %d , ,二重循环,按行输入二维数组a的数据,二重循环,按行输出二维数组a的数据,返回,例9-10:有一个3行4列的二维数组,从键盘输入它的前两行数据,并将前两行按列求和的结果对应存储在第三行的各元素中。,返回,25,45,65,85,练习:有一个3行4列的二维数组,计算其所有元素的和。,分析:二维数组互换情况如下:,例9-11 将一个32的二维
19、数组的行列互换,保存到另一个23的二维数组中。,17 29 16 25 77 53,17 25 29 77 16 53,行列互换,算法分析:,aij与bji相等,返回,A=,B=,int a34;,数组a,行数组元素,列元素,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,a00,a01,a02,a03,a10,a11,a12,a13,a20,a21,a22,a23,指针和二维数组元素的对应关系,9.6、二维数组和指针,int *p; p= ;,?,a0,p,p,例11-5,a0,a0为一维数组名,是一个地址常量,指向数组首元素。,a0,形式存放
20、,实际存储,main() int a34=3,17,8,11,66,7,8,19,12,88,7,16; int *p,max; for(p=a0,max=*p;p max) max=*p; printf(MAX=%dn,max); ,例9-12 求二维数组元素的最大值。,3,17,66,88,9.7 指针数组,1. 指针数组的定义,(1)定义格式: 数据类型 数组名数组长度,例如:int *a10; float *b5;,*,说明: 指针数组是指数组元素为指针的那类数组。,2. 指针数组的赋值,指针数组的赋值与普通数组相同,只是注意所赋的值应该是地址值。另外还要注意所赋的地址的基类型要与指针
21、数组的基类型相同。 例如:,9.8 指向一维数组的指针,1. 指针数组的定义,(1)定义格式: 数据类型 (*数组名)数组长度,例如:int (*a)10; float (*b)5;,说明: 指向一维数组的指针不是指向数组中的某个元素,而是指向由若干个元素组成的一维数组。,2. 指针一维数组的指针的赋值,指向一维数组的指针一般指向二维数组的某一行,所指二维数组任一行中的元素个数应与指针所指向的一维数组的元素个数相同。 例如: int (*p)5; int b35; p=b;,9.9 指向指针的指针,1. 指针数组的定义,(1)定义格式: 数据类型 *指针变量名,例如:int *a; float
22、 *b;,说明: 指针变量可以指向基本类型,也可以指向指针类型,指向指针数据的指针变量简称为指向指针的指针。,第十章 字符串,字符串的处理方法有两种: 1. 一种方法是使用字符数组处理字符串。 2. 另一种方法是使用字符指针处理字符串,这是C语言中更为常用的一种方法。它首先通过一定的方式,用字符指针指向字符串, 然后通过字符指针来访问字符串存贮区域,从而实现对字符串的操作。,10.1、字符数组的定义、初始化,字符型数组是数据类型为字符型的数组,用于存放字符数据,每一个数组元素存放一个字符。 定义格式: char 数组名数组长度 例如: char array10;,1. 字符数组的定义,2. 字符数组的初始化, 同数值型数组的初始化,给字符数组中的各个元素逐个赋值。 例如:char string7=e,x,a,m,p,l,e;, 可以使用一个字符串常量为字符数组赋初值。 例如:char string8=example;, 初始化时,可以省略对数组长度的说明。 例如:char string =example;,返回,使用这种方式对字符数组初始化时,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年软件工程师专业水平测试系统设计与软件工程实操模拟题
- 2026年程序员职业水平考试辅导数据结构与算法实践题目
- 2026年生物技术与应用专业试题库
- 2026年土木工程基础道路桥梁设计与施工知识测试题集
- 2026年网络安全管理与防范措施题集
- 深圳市第二高级中学2026届数学高一下期末达标检测试题含解析
- 2026年酒店管理专业技能测试题客房服务与前厅管理
- 2026年网络购物对现代生活方式的影响和潜在问题探究题目
- 2026年哲学思想与伦理道德探讨题库
- 2026年高级国际商业策略案例分析题库
- 名著导读傅雷家书
- 钻探施工安全培训
- 博士组合物使用指南
- 高校辅导员队伍建设基本情况报告
- 《相变储热供暖工程技术标准》
- 安装防雨棚合同协议书
- DL∕T 1917-2018 电力用户业扩报装技术规范
- 光伏维修维保合同
- CJJ 82-2012 园林绿化工程施工及验收规范
- 黑龙江商业职业学院单招《语文》考试复习题库(含答案)
- 变压器借用合同范本
评论
0/150
提交评论