C第六章数组、指针与字符串.ppt
《C第六章数组、指针与字符串.ppt》由会员分享,可在线阅读,更多相关《C第六章数组、指针与字符串.ppt(93页珍藏版)》请在三一文库上搜索。
1、C+ 程序设计 第六章 数组、指针与字符串,数组的概念 数组是具有一定顺序关系的若干相同类型变量的集合体,组成数组的变量称为该数组的元素。 数组属于构造类型。,一维数组的声明与引用 一维数组的声明 类型说明符 数组名 常量表达式 ; 例如: int a10; 表示 a 为整型数组,有10个元素:a0.a9 引用:必须先声明,后使用。 只能逐个引用数组元素,而不能一次引用整个数组! 例如:a0=a5+a7-a2*3,/ 数组元素的使用 #include void main() double a3; a0 = 11.11; a1 = 33.33; a2 = 55.55; cout “a0 = “
2、a0 endl; cout “a1 = “ a1 endl; cout “a2 = “ a2 endl; cout “a0 + a1 + a2 = “ a0 + a1 + a2 endl; /* 程序运行结果 * a0 = 11.11 a1 = 33.33 a2 = 55.55 a0 + a1 + a2 = 99.99 * 程序结束 */,一维数组的存储顺序 数组元素在内存中顺次存放,它们的地址是连续的。 例如:具有10个元素的数组 a,在内存中的存放次序如下: 数组名字是数组首元素的内存地址。 数组名是一个常量,不能被赋值。,例:逆序显示一个数组的内容,/ 逆序显示一个数组的内容 #incl
3、ude void main() const int SIZE=5; double aSIZE; int i; cout ai; cout = 0; i -) cout ai “ “; cout endl; /* 程序运行结果 * Enter 5 numbers: 1 3 5 7 9 In reverse order: 9 7 5 3 1 * 程序结束 */,一维数组的初始化 可以在编译阶段使数组得到初值: 在声明数组时对数组元素赋以初值。 例如:static int a10 = 0,1,2,3,4,5,6,7,8,9 ; 可以只给一部分元素赋初值。 例如:static int a10 = 0,
4、1,2,3,4 ; 在对全部数组元素赋初值时,可以不指定数组长度。 例如:static int a = 1,2,3,4,5 ;,/ 一维数组的初始化 #include void main() float a = 22.2, 44.4, 66.6 ; int size = sizeof(a)/sizeof(float); for (int i=0; isize; i+) cout “a“ i “ = “ ai endl; /* 程序运行结果 * a0 = 22.2 a1 = 44.4 a2 = 66.6 * 程序结束 */,/ Causing an unhandled exception #in
5、clude void main() double a = 22.2, 44.4, 66.6 ; double x=11.1; cout “x = “ x endl; a3333 = 88.8; / ERROR ! cout “x = “ x endl; cout a endl; ,/* 程序运行结果 * x = 11.1,例:用数组来处理求 Fibonacci 数列, 输出前项。,/用数组来处理求Fibonacci数列,输出前20项。 #include void main() int i ; static int f20 = 1 , 1 ; /初始化第0、1个数 for(i = 2; i 20
6、; i +) fi = fi-2 + fi-1 ; /求第219个数 for(i = 1; i = 20; i +) /输出,每行5个数 cout fi-1 t ; if(i%5=0) cout endl ; ,1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765,二维数组的声明及引用 二维数组的声明 类型说明符 数组名常量表达式常量表达式 例如:float a34; 引用 例如:b12=a23/2 存储顺序:按行存放,二维数组的初始化 分行给二维数组赋初值 static int a34=1,2,3,4,5,6,7
7、,8,9,10,11,12; 将所有数据写在一个内,按顺序赋值 static int a34=1,2,3,4,5,6,7,8,9,10,11,12; 可以对部分元素赋初值 例如:static int a34=1,0,6,0,0,11;,数组作为函数参数 数组元素作实参,与单个变量一样。 数组名作参数,形、实参数都应是数组名,类型要一样,传送的是数组首地址。,例:数组在函数调用中的应用,/ Passing an array to a function #include void read(int a , int /* 程序运行结果 * 输入整数(输入0, 则结束!): a0: 2 a1: 4 a
8、2: 6 a3: 0 数组中有 3 个元素: 2 4 6 数组中各元素的和为 12 * 程序结束 */,void read(int a , int ,例:建立一个二维数组,按矩阵形式输出,然后对每一行求和。,#include void RowSum(int A 4, int nrow) for (int i = 0; i nrow; i+) int sum = 0; for(int j = 0; j 4; j+) sum += Aij; cout “Sum of row “ i “ is “ sum endl; void main(void) int Table34 = 1,2,3,4,2,3
9、,4,5,3,4,5,6; for (int i = 0; i 3; i+) for (int j = 0; j 4; j+) cout Tableij “ “; cout endl; RowSum(Table,3); /* 程序运行结果 * 1 2 3 4 2 3 4 5 3 4 5 6 Sum of row 0 is 10 Sum of row 1 is 14 Sum of row 2 is 18 * 程序结束 */,对象数组 定义: 类名 数组名元素个数; 访问方法: 通过下标访问 数组名下标.成员名,对象数组初始化 数组中每一个元素对象被创建时,系统都会调用构造函数类初始化该对象。 通
10、过初始化列表赋值。 例: Location A2 = Location(1,2),Location(3,4); 如果没有为数组元素指定显式初始值,数组元素使用缺省值初始化(调用缺省构造函数)。 Location B2 = Location(5,8); Location C2;,数组元素所属类的构造函数 不定义构造函数,则采用缺省构造函数。 各元素对象的初值要求为相同的值时,可以定义出具有缺省形参值的构造函数。 各元素对象的初值要求为不同的值时,需要定义带形参(无缺省值)的构造函数。 当数组中每一个对象被删除时,系统都要调用一次析构函数。,/Location.h #if ! defined(_L
11、OCATION_H) #define _LOCATION_H class Location public: Location( ); Location(int xx,int yy); Location( ); void Move(int x,int y); int GetX() return X; int GetY() return Y; private: int X,Y; ; #endif,#include #include “Location.h“ Location:Location() X = Y = 0; cout “Default Constructor called.“ endl;
12、 Location:Location(int xx, int yy) X = xx; Y = yy; cout “Constructor called.“ endl; Location:Location() cout “Destructor called.“ endl; void Location:Move(int x, int y) X = x; Y = y; ,/6_3.cpp #include #include “Location.h“ int main() cout“Entering main.“endl; Location A2; for(int i=0;i2;i+) Ai.Move
13、(i+10,i+20); cout“Exiting main.“endl; return 0; ,/* 程序运行结果 * Entering main. Default Constructor called. Default Constructor called. Exiting main. Destructor called. Destructor called. * 程序结束 */,指针变量的概念 指针:另一个变量的地址, 用于间接访问变量 指针变量:用于存放地址的变量 指针运算符:* 取地址运算符:,指针变量的初始化 语法形式 存储类型 数据类型 *指针名初始地址; 例: int *pa=
14、 注意事项 用变量地址作为初值时,该变量必须在指针初始化之前已说明过,且变量类型应与指针类型一致。 可以用一个已赋初值的指针去初始化另一 个指针变量。 不要用一个内部 auto 型变量去初始化 static 型指针。,例6-5:指针的声明、赋值和使用。,/由书P163. 例6-5改编 #include void main() int *p ; int i ; / int *p , i ; p = /* 程序运行结果 * i = 10 & i = 0x0012FF78 * p = 10 p = 0x0012FF78 & p = 0x0012FF7C * 程序结束 */,指针变量的算术运算 指针与
15、整数的加减运算 指针 p 加上或减去 n ,其意义是指针当前指向位置的前方或后方第 n 个数据的地址。 运算的结果值取决于指针指向的数据类型。 指针加一,减一运算 指向下一个或前一个数据。 例如:y=*px+ 相当于 y=*(px+) (*和+优先级相同,自右向左运算),pa,pb-1,pb,pb+1,pb+2,*(pb-1),*pb,*(pb+1),*(pb+2),long *pb,指针变量的关系运算 关系运算 指向相同类型数据的指针之间可以进行各种关系运算。 指向不同数据类型的指针,以及指针与一般整数变量之间的关系运算是无意义的。 指针可以和零之间进行等于或不等于的关系运算。例如:p=0或
16、p!=0,指针变量的赋值运算 指针名=地址 “地址”中存放的数据类型与指针类型必须相符。 向指针变量赋的值必须是地址常量或变量,不能是普通整数。但可以赋值为整数0,表示空指针。 指针的类型是它所指向变量的类型,而不是指针本身数据值的类型。 允许定义指向 void 类型的指针。该指针可以被赋予任何类型对象的地址。 例: void *general;,指向数组元素的指针 定义与赋值 例: int a10, *pa; pa= 通过指针引用数组元素 经过上述定义及赋值后: *pa就是a0,*(pa+1)就是a1,*(pa+i)就是ai. ai, *(pa+i), *(a+i), pai都是等效的。 不
17、能写 a+,因为a是数组首地址,是常量。,例:使用指针遍历一个数组,#include void main() const int SIZE = 3; int aSIZE = 55, 66, 77 ; cout “a = “ a endl; cout “sizeof(int) = “ sizeof(int) endl; int * end = a + SIZE; / converts SIZE to offset 6 int sum = 0; for ( int * p = a; p end; p +) sum += *p; cout “ p = “ p; cout “ *p = “ *p; c
18、out “ sum = “ sum endl; cout “end = “ end endl; ,/* 程序运行结果 * a = 0x0012FF70 sizeof(int) = 4 p = 0x0012FF70 *p = 55 sum = 55 p = 0x0012FF74 *p = 66 sum = 121 p = 0x0012FF78 *p = 77 sum = 198 end = 0x0012FF7C * 程序结束 */,例:检查数组元素的地址,#include void main() int a = 22, 33, 44, 55, 66; int *p; cout “a = “ a
19、“, *a = “ *a endl; for (p = a; p a + 5; p+) cout “p = “ p “, *p = “ *p endl; /* 程序运行结果 * a = 0x0012FF6C, *a = 22 p = 0x0012FF6C, *p = 22 p = 0x0012FF70, *p = 33 p = 0x0012FF74, *p = 44 p = 0x0012FF78, *p = 55 p = 0x0012FF7C, *p = 66 * 程序结束 */,例:设一个a数组,整型,有10个元素。用三种方法输出各元素.,/使用数组下标 void main( ) int a
20、10 ; int i ; for ( i = 0 ; i ai ; cout endl ; for ( i = 0 ; i10 ; i + ) cout ai ; ,/使用数组名 void main( ) int a10 ; int i ; for ( i = 0 ; i ai ; cout endl ; for ( i = 0 ; i 10 ; i +) cout * ( a + i ) ; ,/使用指针变量 void main( ) int a10 ; int *p , i ; for ( i = 0 ; i ai ; cout endl ; for ( p = a ; p ( a + 1
21、0 ) ; p + ) cout * p ; ,例:对输入的两个数按大小顺序输出。,#include void swap(int *p1, int *p2) int p; p=*p1; *p1=*p2; *p2=p; void main( ) int a,b; int *p1, *p2; cin a b; p1 = /* 程序运行结果 * 22 99 a = 99 b = 22 * 程序结束 */,例:将数组a中n个整数按相反顺序存放。,#include void invert(int *p ,int n) /实参是数组名时形参可以是指针。 int temp, i , j , m = (n-1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第六 数组 指针 字符串
链接地址:https://www.31doc.com/p-2142551.html