C语言第八章课件
合集下载
C语言课件:第八章 函数

所有函数都是平行的,相互独立不能嵌套,但可以相 互调用。 C 函数分标准函数(库函数)和自定义函数。 C 函数本身分有参函数和无参函数。
2
8.2 函数定义的一般形式
1.无参函数的定义形式 类型标识符 函数名( ) { 说明部分 ; 语句; } 2.有参函数的定义形式 类型标识符 函数名(形式参数表) 形式参数说明; { 说明部分 ; 语句; }
例: 用函数调用实现字符串的复制。 void copy_string(from , to) char from[ ], to[ ]; 声明形参from, to为字符数组 { int i = 0 ; while ( from[i] != „\0‟ ) { to[i] = from[i]; i++ ; } to[i] = „\0‟ ; 运行结果: string_a = I am a teacher. } 实参以数组名将数组a, b的起 string_b = I am a teacher. 始地址传递给形参 from 和 to main( ) {char a[ ] = “I am a teacher.” ; char b[ ] = “you are a student.” ; copy_string(a, b); printf( “string_a = %s\nstring_b = %s\n”,a,b); }
7
若函数中没有return语句,则该函数被调用后也会带 回不确定的值。如: { int a, b, c ; a = printstar( ); 均为处理字符串的函数 且均没有 return 语句。 b = print_message( ); c = printstar( ); printf(“%d,%d,%d\n”,a,b,c); } 输出的a, b, c的值将是各个被处理的字符串的长度。
C语言课件第8章

C语言程序设计
南昌大学计算中心
第8章 地址和指针
8.1 变量的地址和指针 内存地址:计算机的内存是以字节为单位的一片连续 的存储空间,每一个字节都有一个编号,这个编号就 称为内存地址。 变量的地址:变量所用内存单元的编号(起始地址)。 int a;
float b;
a=3;b=5;
南昌大学计算中心
变量的访问方式: 1、直接存取:程序中对变量进行存取操作,实际上也 就是对某个地址的存储单元进行操作。这种直接按变 量的地址存取变量值的方式称为“直接存取”方式。 2、间接存取:在C语言中还定义了一种特殊的变量, 这种变量用来存放内存地址的,通过这种变量(假如叫 p)间接得到另一变量(假如叫a)的地址,然后再存取变 量a的值的方式称为“间接存取”方式。通常称变量p 指向了变量a,变量a是变量p所指向的对象。 指针:存放某变量地址的变量。 a 1001
printf(“%d %d\n”, *p,(*q)++);
}
等同于*q++
2 2 3 2
南昌大学计算中心
由上述知识总结出以下具有等价关系的对子: 如有:int a=5,*p=&a;
则:&*p *&a (*P)++ *p++
等价于 等价于 等价于 等价于
&a a a++ *(p++)
南昌大学计算中心
南昌大学计算中心
2、通过指针变量获得地址值 可以用赋了值的指针变量给另一个指针变量赋值。 如: int x=1; int *p=&x; int *q=p;
把指针p中存放的地址值赋给指针q
或写成:int x=1; int *p,*q;
南昌大学计算中心
第8章 地址和指针
8.1 变量的地址和指针 内存地址:计算机的内存是以字节为单位的一片连续 的存储空间,每一个字节都有一个编号,这个编号就 称为内存地址。 变量的地址:变量所用内存单元的编号(起始地址)。 int a;
float b;
a=3;b=5;
南昌大学计算中心
变量的访问方式: 1、直接存取:程序中对变量进行存取操作,实际上也 就是对某个地址的存储单元进行操作。这种直接按变 量的地址存取变量值的方式称为“直接存取”方式。 2、间接存取:在C语言中还定义了一种特殊的变量, 这种变量用来存放内存地址的,通过这种变量(假如叫 p)间接得到另一变量(假如叫a)的地址,然后再存取变 量a的值的方式称为“间接存取”方式。通常称变量p 指向了变量a,变量a是变量p所指向的对象。 指针:存放某变量地址的变量。 a 1001
printf(“%d %d\n”, *p,(*q)++);
}
等同于*q++
2 2 3 2
南昌大学计算中心
由上述知识总结出以下具有等价关系的对子: 如有:int a=5,*p=&a;
则:&*p *&a (*P)++ *p++
等价于 等价于 等价于 等价于
&a a a++ *(p++)
南昌大学计算中心
南昌大学计算中心
2、通过指针变量获得地址值 可以用赋了值的指针变量给另一个指针变量赋值。 如: int x=1; int *p=&x; int *q=p;
把指针p中存放的地址值赋给指针q
或写成:int x=1; int *p,*q;
C语言第8章的课件

p1
i1
p1
&i1
10
&i1
p2
i2
p2
&i2
20
&i2
运行
i1 20 i2 10
21
注意
*p1表达式表示指针变量p1指向的对象。在访问指针变量 指向对象前,指针变量必需已指向明确。
如:float *pa,a; *pa=3.14; /*错误,因为pa尚未指向任何变量*/ pa=&a; *pa=3.14;/*给pa指向变量赋值*/
运行
18
几个指针应用的例子
main()
{ int *p1,*p2,i1,i2;
scanf("%d,%d",&i1,&i2);
p1=&i1;
p2=&i2;
printf("%d,%d\n",*p1,*p2);
p2=p1;
printf("%d,%d\n",*p1,*p2);
}
p1
i1
p1
&i1
10
&i1
指针实际上是对存储单元地址的一种形 象化描述。指针即地址。
4
程序中的变量表示命名了的存储区域。不 同类型变量其存储区域字节单元数不一样。
变量名表示该存储区域的别名。变量值是 该存储区域中存储的数据。变量地址是该存储 区域的首地址。
变量地址可通过对变量名进行取地址运算 得到。如:&a得到变量a的地址。
C语言中指针变量也有类型。指针变量 的类型是指指针变量指向对象的类型,即指 针变量存储的指针所表示的对象的类型。
指针变量定义格式:
类型标识符 * 指针变量名; 12
C语言课件第08章

C语言允许函数的递归调用。在递归调用中,调用 函数又是被调用函数,执行递归函数将反复调用其自身。 每调用一次就进入新的一层。
为了防止递归调用无终止地进行,必须在函数内有 终止递归调用的手段。常用的办法是加条件判断,满足 某种条件后就不再作递归调用,然后逐层返回。
递归阶段
递推阶段
递归结束条件
void main()
}
说明:
(1)实参可以是常量、变量、表达式、函数等。无论 实参是何种类型的量,在进行函数调用时,它们都必须具有 确定的值,以便把这些值传送给形参。
因此,应预先用赋值、输入等办法,使实参获得确定的 值。
(2)形参变量只有在被调用时,才分配内存单元;调 用结束时,即刻释放所分配的内存单元。
因此,形参只有在该函数内有效。调用结束,返回调用 函数后,则不能再使用该形参变量。
函数8.的1 定函义数的定义与调用
函数的返回值与函数类型 对被调用函数的说明和函数原型 函数的调用 函数的形参与实参
[Return]
8.1 .1 函数的定义
1.任何函数(包括主函数main())都是由函数说明和函 数体两部分组成。根据函数是否需要参数,可将函数分为无 参函数和有参函数两种。
(1)无参函数的一般形式
getch();
n
} /* */
100 ni
void s(int n)
100
{ int i;
printf("n_x=%d\n",n);
/*输出改变前形参的值*/
for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/
printf("n_x=%d\n",n);
/*输出改变后形参的值*/
为了防止递归调用无终止地进行,必须在函数内有 终止递归调用的手段。常用的办法是加条件判断,满足 某种条件后就不再作递归调用,然后逐层返回。
递归阶段
递推阶段
递归结束条件
void main()
}
说明:
(1)实参可以是常量、变量、表达式、函数等。无论 实参是何种类型的量,在进行函数调用时,它们都必须具有 确定的值,以便把这些值传送给形参。
因此,应预先用赋值、输入等办法,使实参获得确定的 值。
(2)形参变量只有在被调用时,才分配内存单元;调 用结束时,即刻释放所分配的内存单元。
因此,形参只有在该函数内有效。调用结束,返回调用 函数后,则不能再使用该形参变量。
函数8.的1 定函义数的定义与调用
函数的返回值与函数类型 对被调用函数的说明和函数原型 函数的调用 函数的形参与实参
[Return]
8.1 .1 函数的定义
1.任何函数(包括主函数main())都是由函数说明和函 数体两部分组成。根据函数是否需要参数,可将函数分为无 参函数和有参函数两种。
(1)无参函数的一般形式
getch();
n
} /* */
100 ni
void s(int n)
100
{ int i;
printf("n_x=%d\n",n);
/*输出改变前形参的值*/
for(i=n-1; i>=1; i--) n=n+i; /*改变形参的值*/
printf("n_x=%d\n",n);
/*输出改变后形参的值*/
《C语言第八章》PPT课件

精选PPT
7
8.2 指针变量
8.2.3 指针变量的引用
– 变量的数据访问形式
普通变量:变量名—变量存储的数据 指针变量:*变量名—指向存储单元存储的数据
– 定义时:*p表示为指针;使用时*p表示指针指向的数据
– 变量的地址访问形式
普通变量:&变量名—存储数据的首地址 指针变量:变量名—指向的存储单元
精选PPT
9
8.2 指针变量
8.2.3 指针变量的引用
– 指针和变量的几个换算关系:
对于变量,有:名称=数据、&名称=地址 对于指针,有:名称=地址、*名称=指向的数据ຫໍສະໝຸດ 若有定义:int a, *p 则:
– &a、p 是同一类型数据,为地址 –a、*p 是同一类型数据,为整型数据
一般情况下,使用p=&a的形式,让指针与变量关联, 使用*p的形式,访问指向的数据
– 指针变量:
存放指针的变量,称之为指针变量
– 指针变量里面存放的是指针,也就是地址
– 为什么使用指针
更方便、更主动的操作数据、构建数据结构
精选PPT
2
8.1 什么是指针
学习指针的几点建议
– 弄明白存放在内存中的数据是如何访问的
这是学习指针的基础
– 清晰的记住指针和变量的几个关系:
指针的内容,指针指向的内容等等
– 一般情况下,不要将地址值直接赋给指针变量
精选PPT
8
8.2 指针变量
8.2.3 指针变量的引用
– 一般情况下,不能将地址值直接赋给变量
若有 int a,*p; 则:&a=1000
p=2000是错误的
– 指针不会单独使用,常和其他普通变量关联在 一起使用
c语言课件第8章

8.1.2带参宏定义 带参宏定义的一般形式: #define 标识符(形参表) 字符串 其中,形参表是由一个或多个形参组成。 带参宏调用的一般形式:
宏名(实参表);
例:编写一个程序,求3个数中的最大数,要求用带参数 的宏实现。
#include <stdio.h> #define MAX1(a,b) ((a)>(b)?(a):(b)) #define MAX2(a,b,c) (MAX1(a,b)>(c)?MAX1(a,b):(c))
功能:首先计算“常数表达式”的值,如果为真 (非零),就编译“程序段1”,否则编译“程序 段2”。如果没有#else部分,则当“常数表达式” 的值为0时,直接跳过#endif。
例:阅读程序。 #include <stdio.h> main() { #if NULL
printf("NULL is non-zero value!\n"); #else printf("NULL is zero value!\n"); #endif } 运行结果:NULL is zero value!
错
8.2 文件包含
文件包含也是一种预处理语句,它的作用是使一 个源程序文件将另一个源程序文件的全部包含进 来。一般形式为: #include <文件名>或 #include “文件名”
“文件包含”示意图
file1.c
包含
#include”file2.c”
file2.c
A
B
(a)
(b)
file1.c
main() {int a=23;
printf("MAX=%d\n",MAX2(13+5,4,a)); }
C语言课件第八章
例 有参函数 int max(int x,int y) { int z;
z=x>y?x:y; return(z); }
传统风格:
函数类型 函数名(形参表) 形参类型说明
{ 说明部分 语句部分
}
例 有参函数(传统风格) int max(x,y) int x,y; { int z;
z=x>y?x:y; return(z); }
{ int temp; temp=x; x=y; y=temp;
或
return;
}
功能:使程序控制从被调用函数返回到调用函数中, 同时把返回值带给调用函数
说明:
函数中可有多个return语句
若无return语句,遇}时,自动返回调用函数,返回的是一
个不确定的值
若函数类型与return语句中表达式值的类型不一致,按前
float fac(int k) { float t=1; int i;
件中所调用的函数进行了声明,则在各函数中不必再说明。 ▪ 若函数返值是char或int型,系统自动按int型处理
void main() { float add(float a,float b);
float a,b,c; scanf("%f,%f",&a,&b); c=add(a,b); printf("sum is %f",c); } float add(float x, float y) { float z; z=x+y; return(z); }
例 空函数 dummy( ) {}
函数体为空
▪ 8.2.2 有参函数定义 的一般格式
函数返回值类 型
缺省int型 无返回值void
C语言上课PPT 第八章
C 程 序 设 计
第八章 指 针
三,指针变量作函数参数
函数的参数不仅可以是整型,实型和字符型,还 函数的参数 可以是指针类型.当是指针类型时,它的作用是 将一个变量的地址传送到另一个函数中. C语言中函数参数的传递是传值的,即单向值传递. 数值只能从调用函数向被调用函数传递,不能反 过来传递.形参值的改变不会反过来影响实参值 的改变.如例8.4
C 程 序 设 计
第八章 指 针
第二节 指向变量的指针变量
指针变量和普通变量一样占用一定的存储空间,但指针变 指针变 量存储空间中存放的不是普通的数据,而是一个地址.指 量存储空间中存放的不是普通的数据,而是一个地址 针变量是一个地址变量 一,指针变量的定义及初始化
1.指针变量的定义 1
– C语言规定所有变量在使用前必须定义,指定其类型,系统按数据类 型分配内存单元.指针变量不同于整型变量和其他类型的变量,它是 专门存放地址的.必须将它定义为"指针类型 指针类型". 指针类型 格式: 格式:基类型
C 程 序 设 计
第八章 指 针
P182例8.6
程序分析:swap函数是用户定义的函数,它的作用是 交换两个变量(a和b)的值.swap函数的形参p1和p2 是指针变量.程序运行时,先执行main函数,输入 a=79和b=97.然后将a和b的地址分别赋给指针变量 pointer1和pointer2,使pointer1指向a,pointer2指向b.
C 程 序 设 计
第八章 指 针
二,指针变量的引用
1.指针运算符
– (1)取地址运算符& 取地址运算符&是单目运算符,其结合性为自右至左,其 功能是取变量的地址 取变量的地址. 取变量的地址 – (2)取内容运算符* 取内容运算符*,也叫间接引用运算符,其结合性为自右 至左,用来表示指针变量所指的变量 指针变量所指的变量.在*运算符后跟的 指针变量所指的变量 变量必须是指针变量. – 取内容运算符"*",与前面指针变量定义时出现的"*"意义 取内容运算符" 与前面指针变量定义时出现的" 完全不同,指针变量定义时, 完全不同,指针变量定义时,"*"仅表示其后的变量是指针 类型变量,是一个标志,而取内容运算符是个运算符, 类型变量,是一个标志,而取内容运算符是个运算符,其运算 后的值是指针所指向的对象的值. 后的值是指针所指向的对象的值.
《C语言程序设计》课件第8章
含若干个成员,每个成员应有具体的数据类型。
8.1 结构体
❖ 例如,描述日期定义的结构体类型: struct date { int year; int month; int day; }; 其中date是结构体名,该结构体类型是由三个成员组成。成员
都是整型,编者可根据自己需求编写成员,成员的数据类型可以是 任何数据类型,当然也可以包含结构体类型。注意最后大括号后要 加上分号“;”作为结束。
❖ 和定义结构体变量的方法相仿,只需说明其为数组即可。例如: ❖ struct student ❖{ ❖ int num; ❖ char name[20]; ❖ char sex; ❖ int age ; ❖ float score; ❖ char addr[30]; ❖} ❖ struct student stu[3];
8.2结构体数组
❖ 程序定义一个全局的结构体数组leader,它有3个元素,每一个元 素包含两个成员name(姓名)和 count( 票数)。在定义数组时 使之初始化,使3位候选人的票数都先置零。
❖ 在主函数中定义字符数组leader_name,它代表被选人的具体人名, 然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同。 注意leader_name是和结构体数组中的leader[j].name相比, leader[j]是结构体数组中的字符数组leader的第j个元素,它包含 两个成员项,leader_name应该和leader数组第j个元素的name 成员相比。若j为某一值时,输入的姓名与leader[j].name相等, 就执行”leader[j].count++”,由于成员运算符”.”优先于自增运 算符”++”,因此它相当于(leader[j].count)++,使leader[j] 的成员count的值加1。在输入和统计结束之后,将3人的名字和得 票数输出。
8.1 结构体
❖ 例如,描述日期定义的结构体类型: struct date { int year; int month; int day; }; 其中date是结构体名,该结构体类型是由三个成员组成。成员
都是整型,编者可根据自己需求编写成员,成员的数据类型可以是 任何数据类型,当然也可以包含结构体类型。注意最后大括号后要 加上分号“;”作为结束。
❖ 和定义结构体变量的方法相仿,只需说明其为数组即可。例如: ❖ struct student ❖{ ❖ int num; ❖ char name[20]; ❖ char sex; ❖ int age ; ❖ float score; ❖ char addr[30]; ❖} ❖ struct student stu[3];
8.2结构体数组
❖ 程序定义一个全局的结构体数组leader,它有3个元素,每一个元 素包含两个成员name(姓名)和 count( 票数)。在定义数组时 使之初始化,使3位候选人的票数都先置零。
❖ 在主函数中定义字符数组leader_name,它代表被选人的具体人名, 然后把它与3个候选人姓名相比,看它和哪一个候选人的名字相同。 注意leader_name是和结构体数组中的leader[j].name相比, leader[j]是结构体数组中的字符数组leader的第j个元素,它包含 两个成员项,leader_name应该和leader数组第j个元素的name 成员相比。若j为某一值时,输入的姓名与leader[j].name相等, 就执行”leader[j].count++”,由于成员运算符”.”优先于自增运 算符”++”,因此它相当于(leader[j].count)++,使leader[j] 的成员count的值加1。在输入和统计结束之后,将3人的名字和得 票数输出。
C语言程序设计课件第八章-PPT文档资料
8.2 结构
8.2.1.2结构变量定义 结构变量定义有4种方法: (2) 声明类型同时,定义结构变量 struct 结构名 {成员说明序列} 结构变量表; 例:struct point { double x, y, z; } p1,p2,*p3; 说明结构类型point, 并定义三个变量。
8.2 结构
第八章 结构及其它
本章的主要内容包括: C语言的类型定义 结构 联合 位运算和位段
回首页
8.1 类型定义
写程序时自己定义的数据类型称作“用户定义类型”。 形式: typedef 类型名 标识符; typedef的作用仅仅是用新类型名来代表已存在的类型名,并未产 生新的数据类型。原有的类型名依然有效。 新的类型名可以和C语言中原有的各种基本类名一样,方便地用于 定义变量、定义函数的返回值、定义其它构造类型的元素或成 员。 例8.1:typedef int INTEGER; 给int类型一个新的名字INTEGER,此后,可以用INTEGER来定义整 型变量。如:INTEGER i,j,a[10]; 例8.2:typedef char * CHARP; 新类型名CHARP是字符指针类型,表示的旧类型是char *。 CHARP p; 等价于: char *p; 例8.3:typedef double VECT[4]; 定 义 一 种 具 有 4 个 元 素 的 双 精 度 数 组 类 型 VECT ; 程 序 中 VECT v1,v2;定义两个4个元素的双精度数组。
8.2 结构
结构可以将若干个不同类型的数据组合成一个复合数据对象。组 成结构的数据项称结构的成分或成员。 结构类型成员的数量必须固定,但该结构中各个成员的类型可以 不同。
8.2.1 结构类型说明、结构变量定义
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【例8.7】计算最高分
#include <stdio.h> #define N 40 int ReadScore(int score[]); int FindMax(int score[], int n); int main() {
int score[N], max, n;
n = ReadScore(score);
8.3向函数传递一维数组
传递整个数组给另一个函数,可 将数组的首地址作为参数传过去 – (1)用数组名作函数参数 – (2)只复制一个地址自然比复制
全部数据效率高
– (3)由于首地址相同,故实参数
组与形参数组占用同一段内存
– (4)在该函数内,不仅可以读这
个数组的元素,还可以修改它们
简单变量和数组作函数参数的区别
例:以下不能正确定义二维数组的语句是
。
A) int a[2][2]={{1},{2}}; B) int a[ ][2]={1,2,3,4} ;
C) int a[2][2]={{1},2,3}; D) int a[2][ ]={{1,2},{3,4}};
二维数组实例
【例8.4】从键盘输入某年某月(包括闰年),编程输出该年 的该月拥有的天数 闰年的判断条件 (1)能被4整除,但不能被100整除 (2)能把400整除
Ⅱ).对各行中的某一元素赋初值。如: int a[3][4]={{1},{0,3}1000 5000 01 30 0 0
Ⅲi)n.只t 对a[3某][几4]=行{{的1}部,{3分,5元}};素赋初//第值三。行如不:赋初031 值050 500 00
int a[3][4]={{1},{0},{3,5}};
行 92 91 90 86 74
70 65 80 91 76
实际上这是一个关于成绩的矩阵问题。
二维数组的定义
一维数组可解决数列等问题,而矩阵的问题由于出现了 行和列两个因素,需要用两个下标来描述,一个记录行的 变化,另一个记录列的变化。描述该情况的数组,称为二 维数组。如上列矩阵可将其转化为如下的二维数组:
97 87 92 78 83
92 91 90 86 74 70 65 80 91 76
int score[3][5]
8.2 二维数组的定义和初始化
定义的一般形式为: 数据类型 数组名[常量表达式1][常量表达式2];
其中,常量表达式1表示数组的行数(第一维) , 常量表达式2表示数组的列数(第二维) 。
123
450
结果:5, 0, 0
600
000
【例】若int a[ ][3]={1, 2, 3, 4, 5, 6, 7}, 则a数组的第一维大小是多少?
123 4 56 700
数组的数据类型和存储类型
根据数组的数据类型,为每一元素安排相同长度的存储单元 根据数组的存储类型,将其安排在内存的动态存储区、静态
一维数组在内存中所占用的 总字节数 = 数据类型长度×数组长度
例如: int a[10]; //占用40个字节 double b[10]; //占用80个字节
③ 常量表达式 表示该数组中的元素的个数,它规定了数组 的大小,只能为正整数。数组的下标范围为“0”到“常量表 达式-1”,即最小下标为0,最大下标为“常量表达式-1”。
解决方法 • 方法1:逐个元素赋值
b[0]=a[0]; b[1]=a[1]; b[2]=a[2]; b[3]=a[3];
• 方法2:通过循环赋值 int i; for (i=0;i<4;i++) { b[i] = a[i]; }
9/49
8.1一维数组的定义和初始化
【例8.2】编程实现显示用户输入的月份(不包括闰 年的月份)拥有的天数
【例8.7】计算最高分
8.4排序和查找
排序(Sorting)算法 – 交换法排序 – 选择法排序
交换法排序
2019/5/12
38/49
交换法排序
2019/5/12
39/49
【例8.8】交换法从高到低排序
交换法排序
for (i=0; i<n-1; i++) {
for (j=i+1; j<n; j++) {
本章学习内容
对数组名特殊含义的理解 数组类型,数组的定义和初始化 向函数传递一维数组和二维数组 排序、查找、求最大最小值等常用算法
为什么使用数组(Array)?
【例8.1】要读入10人的成绩,然后求平均成绩
需定义10个不同名整型变量,需要使用多个scanf()
int score1,score2,…score10; scanf("%d",&score1); scanf("%d",&score2); ......
printf("Total students are %d\n", n); max = FindMax(score, n);
printf("The highest score is %d\n", max);
return 0; }
max(i=0)
计算最大值算法
max(i=2)
max(i=3)
2019/5/12
3
4c
b[4]
4
50
b[5]
5
54
b[6]
6
58
b[7]
7
5c
b[8]
8
60
b[9]
9
64
c
120
68
a
111
6c
运行程序或单步执行观察变量变化情况可以看到,
变量c和a的值因数组越界而被悄悄破坏了
2019/5/12
12/49
二维数组问题的提出
3个学生每人有5门课程成绩:
列 97 87 92 78 83
a[0][2] a[1][0] a[1][1] a[1][2]
需知道数组每行列数才能从起始地址开始正确读出数组元素
注意:在使用数组元素时,数组下标值应在已定 义的数组大小的范围内。与一维数组一样,注意 不要出现下标越界的错误。
如: int a[3][4];
a[3][4]=2;
①按行为二维数组赋初值。如:
存储区或寄存器区 用sizeof(a)来获得数组a所占字节数
short
二维数组的存储结构
存放顺序:按行存放
先顺序存放第0行元素,再存放第1行元素
short int a[2][3];
a[0][0] a[0][1]
a[0][0] a[0][1] a[0][2] a[0]
a[1] a[1][0] a[1][1] a[1][2]
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
②按数组元素的存储顺序赋初值。如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
③给部分元素赋初值。
Ⅰ).只对各行第一列元素赋初值,如: int a[3][4]={{1},{3},{5}};
if (score[j] > score[i])
"交换成绩score[j]和score[i]"
} }
如何实现两数交换?
temp = score[j]; score[j] = score[i]; score[i] = temp;
00 00 00 00
3500
④当对二维数组的全部元素或部分赋初值时,定义数 组时第一维的长度可省略,但第二维的长度必须给出 ,系统会根据数据的总个数分配存储空间。如: int a[3][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a[ ][4]={1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; int a[ ][4]={{1,2, 3, 4},{5, 6, 7, 8},{9, 10, 11, 12}}; int a[ ][4]={{0,0, 4},{0},{0, 10}};
须是对每一个元素逐个赋值。 下标既可是常量,也可是整型表达式,允许快速随
机访问,如a[i]
–可以像使用普通变量一样使用它们
如何使两个数组的值相等?
main() {
int a[4] = {1,2,3,4}, b[4]; b = a; }
原因: 数组名表示数组的首地址, 其值不可改变!
2019/5/12
而用数组,可共用一个scanf()并利用循环语句读取
int score[10],i; for (i=0; i<10; i++) {
scanf("%d",&score[i]); }
保存大量 同类型的 相关数据
8.1一维数组的定义和初始化
一维数组的定义
数组首地址
存储类型 数据类型 数组名 [整数1] [整数2] …… [整数n];
int a[10];
a[0]
基类型
下标从0开始
a[1]
…
定义一个有10个int型元素的数组 a[7]
– 系统在内存分配连续的10个int空间给此数组
直接对a的访问,就是访问此数组的首地址 a[8]
a[9]
说 明:
① 数据类型是数组的数据类型,也就是每一个数组元 素的类型,可以是C中任何一种数据类型。(如 int,char,float或double或构造类型) ② 数组名是标识符,遵循标识符的命名规则。除了作 为数组的标识外,同时还代表该数组存储空间的首地址 ,也就是第一个数组元素的地址,数组名本身还是一个 地址量。
【例8.5】计算平均分