Presentation is loading. Please wait.

Presentation is loading. Please wait.

第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址

Similar presentations


Presentation on theme: "第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址"— Presentation transcript:

1

2 第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址
第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址 数组的每个元素用下标变量标识

3 第4章 数组 4.1 一维数组 4.2 指针数组 4.3 二维数组 4.4 数组作函数参数 4.5 动态存储 4.6 字符数组与字符串 小结

4 4.1 一维数组 一维数组的元素是基本类型、结构类型或类类型 一维数组是向量

5 4.1.1 一维数组与初始化 一维数组定义与初始化 说明格式为: 类型 标识符 [ 表达式 ] ;

6 4.1.1 一维数组与初始化 一维数组定义与初始化 说明格式为: 类型 标识符 [ 表达式 ] ; 数组元素类型

7 4.1.1 一维数组与初始化 一维数组定义与初始化 说明格式为: 类型 标识符 [ 表达式 ] ; 数组名 存储地址

8 4.1.1 一维数组与初始化 一维数组定义与初始化 说明格式为: 类型 标识符 [ 表达式 ] ; 数组元素个数 常整型表达式

9 4.1.1 一维数组与初始化 一维数组定义与初始化 说明格式为: 类型 标识符 [ 表达式 ] ; 数组的类型

10 4.1.1 一维数组定义与初始化 例如 const int N = 20 ; const int M = 40 ;
4.1.1 一维数组与初始化 一维数组定义与初始化 例如 const int N = 20 ; const int M = 40 ; const int MaxStringSize = 80 ; const int MaxListSize = 1000 ; int A [ 10 ] ; char B [ MaxStringSize ] ; double C [ M*N ] ; int Values [ MaxListSize ] ; A[0] A[1] A[2] A[3] A[4] A[5] A[6] A[7] A[8] A[9] 数组A C[0] C[1] C[2] C[3] C[4] 数组C B[0] B[1] B[2] : B[11] B[12] B[13] 数组B

11 4.1.1 一维数组定义与初始化 例: int ary [ 10 ] , i = 3, j = 5 ; 注意 C++ 不提供对数组的
4.1.1 一维数组与初始化 一维数组定义与初始化 注意 C++ 不提供对数组的 下标范围检查 例: int ary [ 10 ] , i = 3, j = 5 ; ary [ 0 ] ary [ 1 ] ary [ 2 ] ary [ 3 ] ary [ 4 ] ary [ 5 ] ary [ 6 ] ary [ 7 ] ary [ 8 ] ary [ 9 ] ary [ 0 ] = 10 10 ary [ ary [ i ] ] = ary [ 0 ] 10 2 ary [ i ] = 2 ary [ j ] = ary [ i ] 2 ary [ 2+j ] = 31 31

12 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ;

13 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // 各元素分别赋初始值

14 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // 各元素分别赋初始值 // 全部元素初始化为 0

15 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // 各元素分别赋初始值 // 全部元素初始化为 0 // b2[3], b2[4]自动赋 0

16 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // 各元素分别赋初始值 // 全部元素初始化为 0 // b2[3], b2[4]自动赋 0 // 自动定义数组长度为7

17 4.1.1 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值
4.1.1 一维数组与初始化 一维数组定义与初始化 与普通变量一样,可以在数组定义的同时,对数组元素赋初值 例: int a [ 5 ] = { 1, 3, 5, 7, 9 }; int b1 [ 5 ] = { 0 } ; int b2 [ 5 ] = { 1, 2, 3, } ; int c [ ] = { 1, 2, 3, 4, 5, 6, 7 } ; int d [ 5 ] = { 1, 2, 3, 4, 5, 6, 7 } ; // 各元素分别赋初始值 // 全部元素初始化为 0 // b2[3], b2[4]自动赋 0 // 自动定义数组长度为7 // 错误,初始化数据过多

18 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; }

19 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化

20 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值

21 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 // 声明静态数组b并初始化

22 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 // 声明静态数组b并初始化 // 输出数组b的全部元素值

23 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7

24 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 int 类型数据字节数 // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7

25 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 数组 c 的字节数 sizeof ( int [7] ) // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7

26 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 数组 c 的元素个数 // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7

27 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7 // 输出数组c的全部元素值

28 // 例4-1 数组测试 #include<iostream> using namespace std ; int main()
4.1.1 一维数组与初始化 // 例4-1 数组测试 #include<iostream> using namespace std ; int main() { int i , a[ 5 ] = { 1, 3, 5, 7, 9 } ; for ( i = 0; i < 5; i ++ ) cout << a[ i ] << " " ; cout << endl ; static int b[ 5 ] = { 1, 2, 3 }; for ( i = 0 ; i < 5 ; i ++ ) cout << b[ i ] << " " ; int c[ ] = { 1, 2, 3, 4, 5, 6, 7 } ; for ( i = 0 ; i < sizeof ( c ) / sizeof ( int ) ; i ++ ) cout << c[ i ] << " " ; } // 声明数组a并初始化 // 输出数组a的全部元素值 // 声明静态数组b并初始化 // 输出数组b的全部元素值 // 声明数组c,初始化,默认长度 7 // 输出数组c的全部元素值

29

30 4.1.2 一维数组访问 一维数组访问 1.以下标方式访问数组 访问格式: 数组名 [ 表达式 ]

31 4.1.2 一维数组访问 一维数组访问 1.以下标方式访问数组 访问格式: 数组名 [ 表达式 ] 数组的地址

32 4.1.2 一维数组访问 一维数组访问 1.以下标方式访问数组 访问格式: 数组名 [ 表达式 ] 整型表达式 地址偏移值

33 #include<iostream> using namespace std ; int main()
4.1.2 一维数组访问 //例4-2 以下标方式访问数组 #include<iostream> using namespace std ; int main() { int i, total = 0; int intary [10] ; for( i = 0 ; i < 10 ; i ++ ) { intary[ i ] = i ; cout << intary[ i ] << " " ; } cout << endl; for( i = 0; i < 10 ; i ++ ) total += intary[ i ] ; cout << "total = " << total << endl ;

34 #include<iostream> using namespace std ; int main()
4.1.2 一维数组访问 //例4-2 以下标方式访问数组 #include<iostream> using namespace std ; int main() { int i, total = 0; int intary [10] ; for( i = 0 ; i < 10 ; i ++ ) { intary[ i ] = i ; cout << intary[ i ] << " " ; } cout << endl; for( i = 0; i < 10 ; i ++ ) total += intary[ i ] ; cout << "total = " << total << endl ; 循环控制变量 作下标表达式

35 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 2.以指针方式访问数组 // 例4-3 #include<iostream> using namespace std ; int main() { int a[ 10 ] = { 1, 3, 5, 7, 9 } ; cout << "Address of array a : " << a << endl ; cout << "Address of element a[3] : " << &a[3] << endl ; }

36 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 2.以指针方式访问数组 // 例4-3 #include<iostream> using namespace std ; int main() { int a[ 10 ] = { 1, 3, 5, 7, 9 } ; cout << "Address of array a : " << a << endl ; cout << "Address of element a[3] : " << &a[3] << endl ; } 数组名 是存储空间首地址

37 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 2.以指针方式访问数组 // 例4-3 #include<iostream> using namespace std ; int main() { int a[ 10 ] = { 1, 3, 5, 7, 9 } ; cout << "Address of array a : " << a << endl ; cout << "Address of element a[3] : " << &a[3] << endl ; } 偏移值 3 * sizeof ( int )

38 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

39 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 a 0x0065FDE4 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

40 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 a+1 0x0065FDE8 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

41 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a+i a+i*sizeof(Type) a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

42 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 1 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

43 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 3 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

44 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: 9 a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

45 4.1.2 一维数组访问 2.以指针方式访问数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] 1 3 5 7 9 2.以指针方式访问数组 数组名是隐含意义的常指针(直接地址) 其关联类型是数组元素的类型 数组元素的 指针访问方式 int a [ 10 ] = { 1, 3, 5, 7, 9 } ; 则: a == & a [ 0 ] a + 1 == & a [ 1 ] a + i == & a [ i ] *a == a [ 0 ] * ( a + 1 ) == a [ 1 ] * ( a + i ) == a [ i ]

46 #include<iostream> using namespace std ; int main()
4.1.2 一维数组访问 //例4-4 用指针方式访问数组 #include<iostream> using namespace std ; int main() { int i, total = 0; int intary [10] ; for( i = 0 ; i < 10 ; i ++ ) { * ( intary + i ) = i ; cout << * ( intary + i ) << " " ; } cout << endl; for( i = 0; i < 10 ; i ++ ) total += * ( intary + i ) ; cout << "total = " << total << endl ;

47 #include<iostream> using namespace std ; int main()
4.1.2 一维数组访问 //例4-4 用指针方式访问数组 #include<iostream> using namespace std ; int main() { int i, total = 0; int intary [10] ; for( i = 0 ; i < 10 ; i ++ ) { * ( intary + i ) = i ; cout << * ( intary + i ) << " " ; } cout << endl; for( i = 0; i < 10 ; i ++ ) total += * ( intary + i ) ; cout << "total = " << total << endl ; 数组元素的 指针表示方式

48 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 int a [ 10 ] ; int * p ; p = a ; cout << *p ; p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ;

49 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 int a [ 10 ] ; int * p ; p = a ; cout << *p ; p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ; // a 是内存的直接地址

50 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 p int a [ 10 ] ; // a 是内存的直接地址 int * p ; p = a ; cout << *p ; p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ; // p 是指针变量

51 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 p 0x0065FDE4 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; cout << *p ; p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ; // p的值是a[0]的地址

52 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 1 p 0x0065FDE4 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ; // 间址访问,输出 a[0] 的值

53 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 p 0x0065FDE4 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; cout << *( p++ ) ; p += 3 ; cout << &p ; // p 指向 a[1]

54 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 p 0x0065FDE8 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; p += 3 ; cout << &p ;

55 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 p 0x0065FDE8 3 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; p += 3 ; cout << &p ; // 输出 a[1] , p 指向 a[2]

56 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; // 输出 a[1] , p 指向 a[2] p += 3 ; cout << &p ; p 0x0065FDEC

57 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; // 输出 a[1] , p 指向 a[2] p += 3 ; cout << &p ; p 0x0065FDF8 // p 指向 a[5]

58 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 指针变量与数组 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; // 输出 a[1] , p 指向 a[2] p += 3 ; cout << &p ; p 0x0065FDF8 指针变量的地址 0x0065FDE0 // p 指向 a[5] // 输出 p 的地址

59 4.1.2 一维数组访问 指针变量与数组 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9]
一维数组访问 a[0] a[1] a[2] a[3] a[4] a[5] a[6] a[7] a[8] a[9] a 0x0065FDE4 0x0065FDF0 1 3 5 7 9 0x0065FDE0 0x0065FDF8 p 指针变量与数组 int a [ 10 ] ; // a 是内存的直接地址 int * p ; // p 是指针变量 p = a ; // p的值是a[0]的地址 cout << *p ; // 间址访问,输出 a[0] 的值 p ++ ; // p 指向 a[1] cout << *( p++ ) ; // 输出 a[1] , p 指向 a[2] p += 3 ; // p 指向 a[5] cout << &p ; // 输出 p 的地址 p 0x0065FDF4

60 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a

61 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] 整型指针 a

62 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p = &a[0] p a

63 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a 地址偏移 a + 5

64 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a 间址访问元素 a + 5

65 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] p 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a 指针移动 p a + 5

66 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] p 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a p 下标偏移值 a + 5

67 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] p 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a p a + 5

68 // 例4-5 用指针变量访问数组 注意 循环结束后的指针位置 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9 p
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 注意 循环结束后的指针位置 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a p a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9 a[1]=1 a[3]=3 a[5]=5 a[7]=7 a[9]=9

69 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9 p
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a 指针复位 p a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9 a[1]=1 a[3]=3 a[5]=5 a[7]=7 a[9]=9

70 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a 指针复位 a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9 a[1]=1 a[3]=3 a[5]=5 a[7]=7 a[9]=9

71 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a 指针变量 下标方式访问元素 a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9 a[1]=1 a[3]=3 a[5]=5 a[7]=7 a[9]=9

72 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a [ ] 动词 偏置运算,访问对象 a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9 a[1]=1 a[3]=3 a[5]=5 a[7]=7 a[9]=9

73 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9 p
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a p a + 5 a[0]=1 a[1]=3 a[2]=5 a[3]=7 a[4]=9

74 // 例4-5 用指针变量访问数组 1 a[1] 可以吗? 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream>using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a 可以吗? for( i = 0; i < 5 ; i ++, a ++ ) cout << "a[" << i << "]=" << *a << '\t'; a + 5

75 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a 直接地址 不能修改 for( i = 0; i < 5 ; i ++, a ++ ) cout << "a[" << i << "]=" << *a << '\t'; a + 5

76 // 例4-5 用指针变量访问数组 讨论指针偏移计算 1 int * p ; a[1] int n ; 3 …… a[2] 5
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] 讨论指针偏移计算 int * p ; int n ; …… p = p + n ; a 左操作数类型 int * 右操作数类型 int a + 5

77 // 例4-5 用指针变量访问数组 讨论指针偏移计算 1 int * p ; a[1] int n ; 3 …… a[2] 5
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] 讨论指针偏移计算 int * p ; int n ; …… p = p + n ; 表达式根据运算相容规则, 依 int* 对n 作类型转换: n*sizeof(int) 字节 a a + 5

78 // 例4-5 用指针变量访问数组 1 p a[1] 3 a[2] 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] p a a + 5

79 // 例4-5 用指针变量访问数组 1 a[1] 3 a[2] p 5 a[3] 7 a[4] 9
4.1.2 一维数组访问 // 例4-5 用指针变量访问数组 #include<iostream> using namespace std ; int main() { int a[] = { 1, 3, 5, 7, 9 } , i , *p ; for( p = a; p < a+5 ; p ++ ) cout << "a[" << p-a << "]=" << *p << '\t'; cout << endl; for( p = a, i = 0 ; i < 5; i ++ ) cout << "a[" << i << "]=" << p[i] << '\t'; cout << endl ; } 1 3 5 7 9 a[0] a[1] a[2] a[3] a[4] a p a + 5

80

81 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ;

82 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 数组名

83 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 数组长度

84 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 数组元素类型

85 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如:
4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如: int * pi [ 3 ] ; double * pf [ 5 ] ; char * ps [ 10 ] ;

86 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如:
4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如: int * pi [ 3 ] ; double * pf [ 5 ] ; char * ps [ 10 ] ; //数组元素是关联类型为整型的指针

87 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如:
4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如: int * pi [ 3 ] ; double * pf [ 5 ] ; char * ps [ 10 ] ; //数组元素是关联类型为整型的指针 //数组元素是关联类型为浮点型的指针

88 4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如:
4.2 指针数组 指针数组的元素类型是指针 指针数组的元素存放对象的地址 说明形式为: 类型 * 标识符 [ 表达式 ] ; 例如: int * pi [ 3 ] ; double * pf [ 5 ] ; char * ps [ 10 ] ; //数组元素是关联类型为整型的指针 //数组元素是关联类型为浮点型的指针 //数组元素是关联类型为字符型的指针

89 4.2.1 指向基本数据类型的指针数组 // 例4-6 测试指针数组 #include<iostream>
指向基本数据类型的指针数组 4.2 指针数组 // 例4-6 测试指针数组 #include<iostream> using namespace std ; int main() { int a = 11 , b = 22 , c = 33 , * pi [ 3 ] ; pi [ 0 ] = &a ; pi [ 1 ] = &b ; pi [ 2 ] = &c ; for( int i = 0; i < 3 ; i ++ ) cout << *pi [ i ] << " "; }

90 4.2.1 指向基本数据类型的指针数组 // 例4-6 测试指针数组 #include<iostream>
指向基本数据类型的指针数组 4.2 指针数组 // 例4-6 测试指针数组 #include<iostream> using namespace std ; int main() { int a = 11 , b = 22 , c = 33 , * pi [ 3 ] ; pi [ 0 ] = &a ; pi [ 1 ] = &b ; pi [ 2 ] = &c ; for( int i = 0; i < 3 ; i ++ ) cout << *pi [ i ] << " "; } 33 22 11 a b c pi[0] pi[1] pi[2]

91 4.2.1 指向基本数据类型的指针数组 // 例4-6 测试指针数组 #include<iostream>
指向基本数据类型的指针数组 4.2 指针数组 // 例4-6 测试指针数组 #include<iostream> using namespace std ; int main() { int a = 11 , b = 22 , c = 33 , * pi [ 3 ] ; pi [ 0 ] = &a ; pi [ 1 ] = &b ; pi [ 2 ] = &c ; for( int i = 0; i < 3 ; i ++ ) cout << *pi [ i ] << " "; } *pi[0] *pi[1] *pi[2] 33 22 11 a b c pi[0] pi[1] pi[2] &a &b &c

92 4.2.1 指向基本数据类型的指针数组 // 例4-6 测试指针数组 #include<iostream>
指向基本数据类型的指针数组 4.2 指针数组 // 例4-6 测试指针数组 #include<iostream> using namespace std ; int main() { int a = 11 , b = 22 , c = 33 , * pi [ 3 ] ; pi [ 0 ] = &a ; pi [ 1 ] = &b ; pi [ 2 ] = &c ; for( int i = 0; i < 3 ; i ++ ) cout << *pi [ i ] << " "; } *pi[0] *pi[1] *pi[2] 33 22 11 a b c pi[0] pi[1] pi[2] &a &b &c

93

94 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

95 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } pf 是长度为3的数组 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

96 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
4.2 指针数组 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 数组元素是指针 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

97 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
4.2 指针数组 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 指针的关联类型 是长度为2的浮点数组 double [2] pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

98 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 取对象地址 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

99 4.2.2 指向数组的指针数组 // 例4-7 i == 0 , pf [ i ] == &aa
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } i == 0 , pf [ i ] == &aa (1)访问数组元素 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

100 4.2.2 指向数组的指针数组 // 例4-7 i == 0 , pf [ i ] == &aa
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } i == 0 , pf [ i ] == &aa *pf [ i ] == aa (2)访问对象 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

101 4.2.2 指向数组的指针数组 // 例4-7 i == 0 , pf [ i ] == &aa
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } i == 0 , pf [ i ] == &aa *pf [ i ] == aa j ==1 , *pf [ i ]+1 == aa+1 &aa[1] (3)地址偏移 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

102 4.2.2 指向数组的指针数组 // 例4-7 i == 0 , pf [ i ] == &aa
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } i == 0 , pf [ i ] == &aa *pf [ i ] == aa j ==1 , *pf [ i ]+1 == aa+1 *(*pf [ i ]+j) == *(aa+j) == aa[j] (4)访问对象 pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

103 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义

104 4.2.2 指向数组的指针数组 讨论 aa 与 &aa // 测试aa 与 &aa #include<iostream>
4.2 指针数组 指向数组的指针数组 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 // 测试aa 与 &aa #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; cout << "aa = " << aa <<endl ; cout << "&aa = " << &aa <<endl ; } aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义

105 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 二级指针 aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义 pf[] 数组元素指向一维数组 元素类型是二级指针 aa 是一级指针 pf [0] = & aa 逻辑上同级指针操作

106 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
4.2 指针数组 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 修改 aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义 pf [0] = aa ; error C2440: '=' : cannot convert from 'double [2]' to 'double (*)[2]' pf[] 数组元素指向一维数组 元素类型是二级指针 aa 是一级指针 pf [0] = & aa 逻辑上同级指针操作

107 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 一级指针 aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义 pf [0] = aa ; error C2440: '=' : cannot convert from 'double [2]' to 'double (*)[2]' pf[] 数组元素指向一维数组 元素类型是二级指针 aa 是一级指针 pf [0] = & aa 逻辑上同级指针操作

108 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 讨论 aa 与 &aa aa 是一维数组名,内存直接地址 二级指针 aa 0x0066FDE8 0x0066FDF0 aa[0] aa[1] aa 不是存储在指针变量的值 &aa 没有实质意义 pf [0] = aa ; error C2440: '=' : cannot convert from 'double [2]' to 'double (*)[2]' pf[] 数组元素指向一维数组 元素类型是二级指针 aa 是一级指针 pf [0] = & aa 逻辑上同级指针操作

109 4.2.2 指向数组的指针数组 // 例4-7 #include<iostream> using namespace std ;
指向数组的指针数组 4.2 指针数组 // 例4-7 #include<iostream> using namespace std ; int main() { double aa [2] = { 1.1, 2.2 } ; double bb [2] = { 3.3, 4.4 } ; double cc [2] = { 5.5, 6.6 } ; double ( * pf [3] ) [2] ; pf [0] = & aa ; pf [1] = & bb ; pf [2] = & cc ; for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 2 ; j ++ ) cout << * ( * pf [ i ] + j ) << " " ; cout << endl ; } 定义数组类型 double [2] typedef double aryType [2] ; aryType aa = { 1.1, 2.2 } ; aryType bb = { 3.3, 4.4 } ; aryType cc = { 5.5, 6.6 } ; aryType * pf [ 3 ] ; pf[0] pf[1] pf[2] &aa &bb &cc aa[0] aa[1] bb[0] bb[1] cc[0] cc[1] aa bb cc pf

110 4.2.3 指向函数的指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; }

111 4.2.3 指向函数的指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; }

112 4.2.3 指向函数的指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H
4.2 指针数组 指向函数的指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } 函数类型

113 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream>
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; }

114 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream> 声明指向函数的
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } 声明指向函数的 指针数组 //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; }

115 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream>
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } 获取 函数入口地址 //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; }

116 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream>
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; } 调用 不同函数

117 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream>
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; } 等价 调用方式 ( pfun [ i ] ) ( x )

118 × 4.2.3 指向函数的指针数组 //ex4_8.cpp #include<iostream>
指向函数的指针数组 4.2 指针数组 // 例4-8 用指针数组调用函数 // func.h #ifndef FUNC_H #define FUNC_H const double PI = ; double Square_Girth ( double l ) { return 4 * l ; } double Square_Area ( double l ) { return l * l ; } double Round_Girth ( double r ) { return 2 * PI * r ; } double Round_Area ( double r ) { return PI * r * r ; } typedef double ft ( double ) ; #endif //ex4_8.cpp #include<iostream> using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; } //ex4_8.cpp #include<iostream>using namespace std ; #include " func.h " int main() { int i ; double x = 1.23 ; ft * pfun [ 4 ] ; pfun [ 0 ] = Square_Girth ; pfun [ 1 ] = Square_Area ; pfun [ 2 ] = Round_Girth ; pfun [ 3 ] = Round_Area ; for ( i = 0 ; i < 4 ; i ++ ) cout << ( * pfun [ i ] ) ( x ) << endl ; return ; } 指针变量地址 不是函数地址 × (&pfun [ i ] ) ( x )

119

120 4.3 二维数组 二维数组 每一个元素是类型相同、长度相等的一维数组 n 维数组 每一个元素是类型相同、长度相等的 n-1 维数组

121 4.3 二维数组 二维数组 a [ 0 ] a [ 1 ] a [ 2 ]

122 4.3 二维数组 二维数组 a [ 0 ] a [ 1 ] a [ 2 ] a[0][0] a[0][1] a[0][2] a[0][3]

123 4.3 二维数组 三维数组 b [ 0 ] b [ 1 ] b [ 2 ]

124 4.3 二维数组 三维数组 b[0][0] 17 19 10 18 b [ 0 ] b[0][1] 23 26 22 29 b[1][0]
b [ 0 ] b [ 1 ] b [ 2 ]

125 4.3 二维数组 三维数组 b [ 0 ] b [ 1 ] b [ 2 ] b[0][0] b[0][1] b[1][0] b[1][1] b[2][0] b[2][1] b[0][0][0] b[0][0][1] b[0][0][2] b[0][0][3] b[0][0][4] b[0][1][0] b[0][1][1] b[0][1][2] b[0][1][3] b[0][1][4] b[1][0][0] b[1][0][1] b[1][0][2] b[1][0][3] b[1][0][4] b[1][1][0] b[1][1][1] b[1][1][2] b[1][1][3] b[1][1][4] b[2][0][0] b[2][0][1] b[2][0][2] b[2][0][3] b[2][0][4] b[2][1][0] b[2][1][1] b[2][1][2] b[2][1][3] b[2][1][4]

126 4.3.1 二维数组定义与初始化 定义多维数组 类型 数组名 [ 常量表达式 ] … [ 常量表达式 ] ; 例:
类型 数组名 [ 常量表达式 ] … [ 常量表达式 ] ; 例: int a [ 3 ] [ 4 ] ; // 二维数组,3 行4列 double b [ 2 ] [ 3 ] [ 2 ] ; // 三维数组,2  3  2 = 12 个元素 int i [ 2 ] [ 3 ] = { { 1, 2, 3 }, { 4, 5, 6 } } ; // 数组初始化 int j [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6 } ; // 与 i 数组初始化方式等价 int k [ ] [ 2 ] [ 3 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 } ; // 缺省第一维长度 int l [ ] [ 4 ] = { { 1 }, { 1 }, { 1 } } ; // 仅对第 0 列元素赋初值 int m [ 3 ] [ ] = { 1, 2, 3, 4, 5, 6 } // 错误,不能省略第二维长度

127 多维数组按高维优先存放 a [ 3 ] [ 4 ] b [ 2 ] [ 3 ] [ 2 ] a [ 0 ] [ 0 ]
4.3.1 二维数组定义与初始化 多维数组按高维优先存放 a [ 3 ] [ 4 ] b [ 2 ] [ 3 ] [ 2 ] a [ 0 ] [ 0 ] a [ 0 ] [ 1 ] a [ 0 ] [ 2 ] a [ 0 ] [ 3 ] b [ 0 ] [ 0 ] [ 0 ] b [ 0 ] [ 0 ] [ 1 ] b [ 0 ] [ 1 ] [ 0 ] b [ 0 ] [ 1 ] [ 1 ] a [ 1 ] [ 0 ] a [ 1 ] [ 1 ] a [ 1 ] [ 2 ] a [ 1 ] [ 3 ] b [ 0 ] [ 2 ] [ 0 ] b [ 0 ] [ 2 ] [ 1 ] b [ 1 ] [ 0 ] [ 0 ] b [ 1 ] [ 0 ] [ 1 ] a [ 2 ] [ 0 ] a [ 2 ] [ 1 ] a [ 2 ] [ 2 ] a [ 2 ] [ 3 ] b [ 1 ] [ 1 ] [ 0 ] b [ 1 ] [ 1 ] [ 1 ] b [ 1 ] [ 2 ] [ 0 ] b [ 1 ] [ 2 ] [ 1 ]

128 4.3.2 二维数组访问 4.3.2 二维数组访问 1. 以下标方式访问二维数组 数组名 [ 表达式1 ] [ 表达式2 ]

129 // 例4-9 访问二维数组 #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; }

130 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a

131 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a i j

132 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a i j

133 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a i j

134 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 i j

135 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 i j 1

136 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 i j 1

137 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 i j 2

138 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 i j 2

139 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 i j 3

140 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 i j 3

141 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 i j 4

142 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 i 1 j 4

143 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 i 1 j

144 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 i 1 j

145 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 i 1 j 1

146 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 i 1 j 1

147 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 i 1 j 2

148 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 i 1 j 2

149 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 i 1 j 3

150 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 i 2 j

151 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 i 2 j 1

152 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 i 2 j 2

153 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 12 i 2 j 3

154 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 12 i 2 j 4

155 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 12 i 3 j 4

156 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 12 i j

157 // 例4-9 访问二维数组 a #include <iostream> #include <iomanip>
4.3.2 二维数组访问 // 例4-9 访问二维数组 #include <iostream> #include <iomanip> using namespace std ; int main ( ) { int a [ 3 ] [ 4 ] ; int i , j ; for ( i = 0 ; i < 3 ; i ++ ) for ( j = 0 ; j < 4 ; j ++ ) cin >> a [ i ] [ j ] ; { for ( j = 0 ; j < 4 ; j ++ ) cout << setw ( 5 ) << a [ i ] [ j ] ; cout << endl ; } a 2 4 6 8 1 3 5 7 9 10 11 12 i j

158 以上结论可以推广到多维数组, 二维数组的每一个元素是同构的一维数组
4.3.2 二维数组访问 2. 以指针方式访问二维数组 从一维数组元素的地址关系可知:  数组名代表数组的首地址  任一数组元素的地址,可以用数组名加偏移量表示 偏移量单位是数组元素的大小 地址值 元素值 a  & a[ 0 ] a [ 0 ]  * a a + 1  & a[ 1 ] a [ 1 ]  * ( a + 1 ) a + 2  & a[ 2 ] a [ 2 ]  * ( a + 2 ) : : a + i  & a[ i ] a [ i ]  * ( a + i ) 以上结论可以推广到多维数组, 二维数组的每一个元素是同构的一维数组

159 double a [3][5] *a a [0] [0] a a [ 0 ] *a[0] a [0] [1] *(*a+1)
4.3.2 二维数组访问 double a [3][5] a a+1 a+2 *a *(a+1) *(a+2) a [0] [0] a [0] [1] : a [1] [0] a [1] [1] a [2] [0] a [2] [1] 1000 1008 1040 1048 1080 1088 a [ 0 ] a [ 1 ] a [ 2 ] *a[0] *(*a+1) *a[1] *(*(a+1)+1) a [ 0 ] + 1 * a + 1 a [ 1 ] + 1 * ( a+1) + 1 a [ 2 ] + 1 * ( a+2) + 1

160 二维数组名 a 是逻辑上的一个二级指针, a [ i ] 是一级指针 用二维数组名引用基本类型时,应当是二级引用,但不能
4.3.2 二维数组访问 2. 以指针方式访问二维数组 二维数组名 a 是逻辑上的一个二级指针, a [ i ] 是一级指针 用二维数组名引用基本类型时,应当是二级引用,但不能 直接把二维数组名赋给二级指针变量,因为不管 n 维数组, 数组名仅是内存块首地址 例: int a [ 3 ] [ 5 ] , **p2 , *p1 ; p1 = * a ; // OK p1 = a [ 0 ] ; // OK p2 = a ; // Error p1 = a ; // Error

161 第0行第1列元素地址 a [0]+1 *a+1 &a[0] [1]
4.3.2 二维数组访问 2. 以指针方式访问二维数组 a [0] [0] a [0] [1] : a [1] [0] a [1] [1] a [2] [0] a [2] [1] 1000 1004 1020 1024 1030 1034 int a [3] [5] 的表示形式: 第0行第1列元素地址 a [0] *a &a[0] [1] 第1行第2列元素地址 a [1] *(a+1) &a[1] [2] 第 i 行第 j 列元素地址 a [ i ]+j *(a+i)+j &a[i] [j] 第1行第2列元素的值 *(a [ 1 ]+2) *( *(a+1)+2) a[1] [2] 第 i 行第 j 列元素的值 *(a [ i ]+j) *( *(a+i)+j) a[i] [j]

162 #include<iostream> using namespace std ; int main()
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; }

163 #include<iostream> using namespace std ; int main()
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 取第 0 行元素的首地址

164 #include<iostream> using namespace std ; int main()
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 第 i 行第 j 个元素

165 No ! 2. 以指针方式访问二维数组 // 例4-10 #include<iostream>
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 可以改为 p = a 吗? No ! a 是逻辑上的二级指针, 不能把 a 赋给一级指针变量

166 No ! 2. 以指针方式访问二维数组 // 例4-10 #include<iostream>
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 可以改为 p = a[0][0] 吗? No ! a[0][0] 是数组元素值 不能赋给指针变量

167 OK ! 2. 以指针方式访问二维数组 // 例4-10 #include<iostream>
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 可以改为 p = &a[0][0] 吗? OK !

168 #include<iostream> using namespace std ; int main()
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; } 注意 对二维数组不同的处理方式

169 #include<iostream> using namespace std ; int main()
4.3.2 二维数组访问 2. 以指针方式访问二维数组 // 例4-10 #include<iostream> using namespace std ; int main() { int a[3] [5] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ; int * p ; for ( p = a [ 0 ] ; p < a[ 0 ] + 15 ; p ++ ) cout << *p << " " ; cout << endl ; for ( p = * a ; p < *a + 15 ; p ++ ) for ( int i = 0 ; i < 3 ; i ++ ) { for ( int j = 0 ; j < 5 ; j ++ ) cout << * ( a [ i ] + j ) << " " ; }

170

171 4.4 数组作函数参数 数组元素作参数的性质与简单变量相同 数组名作参数传递地址 数组元素和数组名都可以作为引用参数

172 4.4.1 向函数传送数组元素 // 例4-11 #include<iomanip>
向函数传送数组元素 // 例4-11 #include<iomanip> #include<iostream> using namespace std ; void fun( int, int, int ); int main() { int i , a[3] = { 1, 2, 3 } ; fun ( a[0] , a[1] , a[2] ) ; for ( i = 0 ; i < 3 ; i ++ ) cout << setw( 4 ) << a [ i ] ; cout << endl ; } void fun ( int a, int b, int c ) { a++ ; b++ ; c++ ; cout << setw( 4 ) << a << setw( 4 ) << b << setw( 4 ) << c << endl ; return ;

173 4.4.1 向函数传送数组元素 // 例4-11 #include<iomanip>
向函数传送数组元素 // 例4-11 #include<iomanip> #include<iostream> using namespace std ; void fun( int, int, int ); int main() { int i , a[3] = { 1, 2, 3 } ; fun ( a[0] , a[1] , a[2] ) ; for ( i = 0 ; i < 3 ; i ++ ) cout << setw( 4 ) << a [ i ] ; cout << endl ; } void fun ( int a , int b , int c ) { a++ ; b++ ; c++ ; cout << setw( 4 ) << a << setw( 4 ) << b << setw( 4 ) << c << endl ; return ; 传值参数

174 4.4.1 向函数传送数组元素 // 例4-11 #include<iomanip>
向函数传送数组元素 // 例4-11 #include<iomanip> #include<iostream> using namespace std ; void fun( int, int, int ); int main() { int i , a[3] = { 1, 2, 3 } ; fun ( a[0] , a[1] , a[2] ) ; for ( i = 0 ; i < 3 ; i ++ ) cout << setw( 4 ) << a [ i ] ; cout << endl ; } void fun ( int a , int b , int c ) { a++ ; b++ ; c++ ; cout << setw( 4 ) << a << setw( 4 ) << b << setw( 4 ) << c << endl ; return ; 修改局部量

175 4.4.1 向函数传送数组元素 // 例4-11 #include<iomanip>
向函数传送数组元素 // 例4-11 #include<iomanip> #include<iostream> using namespace std ; void fun( int, int, int ); int main() { int i , a[3] = { 1, 2, 3 } ; fun ( a[0] , a[1] , a[2] ) ; for ( i = 0 ; i < 3 ; i ++ ) cout << setw( 4 ) << a [ i ] ; cout << endl ; } void fun ( int a , int b , int c ) { a++ ; b++ ; c++ ; cout << setw( 4 ) << a << setw( 4 ) << b << setw( 4 ) << c << endl ; return ;

176 4.4.2 数组名作函数参数 // 例4-12 #include <iostream>
数组名作函数参数 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ;

177 4.4.2 数组名作函数参数 a 0x0065FDD0 // 例4-12 1 #include <iostream> 2
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ;

178 4.4.2 数组名作函数参数 a 0x0065FDD0 // 例4-12 1 #include <iostream> 2
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ;

179 4.4.2 数组名作函数参数 n a 0x0065FDD0 ap // 例4-12 1 #include <iostream>
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 ap n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ;

180 4.4.2 数组名作函数参数 10 n a 0x0065FDD0 ap // 例4-12 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD0 ap 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ;

181 4.4.2 数组名作函数参数 10 n a 0x0065FDD0 ap // 例4-12 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap

182 4.4.2 数组名作函数参数 10 n a 0x0065FDD0 ap // 例4-12 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap m

183 4.4.2 数组名作函数参数 10 n a 0x0065FDD0 ap // 例4-12 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap m i

184 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap 1 m i

185 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap 1 m i

186 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap 1 m 1 i

187 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap 3 m 1 i

188 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD8 ap 3 m 1 i

189 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD8 ap 3 m 2 i

190 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD8 ap 6 m 2 i

191 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDDC ap 6 m 2 i

192 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDF8 ap 55 m 10 i

193 数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 10 n // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDF8 ap 55 m 10 i

194 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 ap 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap 形参仅仅是一个普通指针 等价于 int * ap

195 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 ap 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD0 ap 修改指针 是合法操作

196 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap 修改指针 是合法操作

197 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap 但 a ++ 是非法操作

198 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap ( const int ap[ ] , int n ) 意义是什么?

199 4.4.2 数组名作函数参数 // 例4-12 #include <iostream> a 0x0065FDD0 1
数组名作函数参数 数组名作函数参数 a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 // 例4-12 #include <iostream> using namespace std ; int sum ( int ap[ ] , int n ) { int m = 0 ; for ( int i = 0 ; i < n ; i ++ ) { m += * ap ; ap ++ ; } return m; int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; cout << "sum = " << sum ( a , 10 ) << endl ; 0x0065FDD4 ap ( const int ap[ ] , int n ) 对数组元素 只读访问

200 ? // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ;
数组名作函数参数 // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ; void test ( int ap[] , double bp[] , char cp [] ) { cout << "sizeof ( ap ) = " << sizeof ( ap ) << endl ; cout << "sizeof ( bp ) = " << sizeof ( bp ) << endl ; cout << "sizeof ( cp ) = " << sizeof ( cp ) << endl ; } int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double b [ 10 ] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 } ; char c [ 10 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } ; cout << "sizeof ( a ) = " << sizeof ( a ) << endl ; cout << "sizeof ( b ) = " << sizeof ( b ) << endl ; cout << "sizeof ( c ) = " << sizeof ( c ) << endl ; test ( a, b, c ) ; a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD4 ap ?

201 ? // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ;
数组名作函数参数 // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ; void test ( int ap[] , double bp[] , char cp [] ) { cout << "sizeof ( ap ) = " << sizeof ( ap ) << endl ; cout << "sizeof ( bp ) = " << sizeof ( bp ) << endl ; cout << "sizeof ( cp ) = " << sizeof ( cp ) << endl ; } int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double b [ 10 ] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 } ; char c [ 10 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } ; cout << "sizeof ( a ) = " << sizeof ( a ) << endl ; cout << "sizeof ( b ) = " << sizeof ( b ) << endl ; cout << "sizeof ( c ) = " << sizeof ( c ) << endl ; test ( a, b, c ) ; a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD4 ap 0x0065FDD4 ap ?

202 ? // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ;
数组名作函数参数 // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ; void test ( int ap[] , double bp[] , char cp [] ) { cout << "sizeof ( ap ) = " << sizeof ( ap ) << endl ; cout << "sizeof ( bp ) = " << sizeof ( bp ) << endl ; cout << "sizeof ( cp ) = " << sizeof ( cp ) << endl ; } int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double b [ 10 ] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 } ; char c [ 10 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } ; cout << "sizeof ( a ) = " << sizeof ( a ) << endl ; cout << "sizeof ( b ) = " << sizeof ( b ) << endl ; cout << "sizeof ( c ) = " << sizeof ( c ) << endl ; test ( a, b, c ) ; a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD4 ap sizeof(int*) 0x0065FDD4 ap ? sizeof(int[10])

203 ( int * ap , double * bp , char * cp )
数组名作函数参数 // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ; void test ( int ap[] , double bp[] , char cp [] ) { cout << "sizeof ( ap ) = " << sizeof ( ap ) << endl ; cout << "sizeof ( bp ) = " << sizeof ( bp ) << endl ; cout << "sizeof ( cp ) = " << sizeof ( cp ) << endl ; } int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double b [ 10 ] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 } ; char c [ 10 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } ; cout << "sizeof ( a ) = " << sizeof ( a ) << endl ; cout << "sizeof ( b ) = " << sizeof ( b ) << endl ; cout << "sizeof ( c ) = " << sizeof ( c ) << endl ; test ( a, b, c ) ; 有区别吗? a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD4 ap ( int * ap , double * bp , char * cp ) 可以吗? int * a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ;

204 ( int * ap , double * bp , char * cp )
数组名作函数参数 // 例4-13 分析程序的输出结果 # include <iostream> using namespace std ; void test ( int ap[] , double bp[] , char cp [] ) { cout << "sizeof ( ap ) = " << sizeof ( ap ) << endl ; cout << "sizeof ( bp ) = " << sizeof ( bp ) << endl ; cout << "sizeof ( cp ) = " << sizeof ( cp ) << endl ; } int main() { int a [ 10 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ; double b [ 10 ] = { 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 } ; char c [ 10 ] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' } ; cout << "sizeof ( a ) = " << sizeof ( a ) << endl ; cout << "sizeof ( b ) = " << sizeof ( b ) << endl ; cout << "sizeof ( c ) = " << sizeof ( c ) << endl ; test ( a, b, c ) ; a 0x0065FDD0 1 2 3 4 5 6 7 8 9 10 0x0065FDD4 ap Ok ( int * ap , double * bp , char * cp ) No int * a = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } ;

205

206 4.4.3 应用举例 数据排序是指对数据按关键字大小重新整理 按照排序的算法、时间空间效率,有许多种排序法 本节讨论两种简单排序法:
应用举例 应用举例 数据排序是指对数据按关键字大小重新整理 按照排序的算法、时间空间效率,有许多种排序法 本节讨论两种简单排序法: 选择排序法 冒泡排序法

207 1. 选择排序法 算法分析: 按降序排列 若一组整数放在数组a[0],a [1],……,a[n-1]中,
应用举例 1. 选择排序法 算法分析: 按降序排列 若一组整数放在数组a[0],a [1],……,a[n-1]中, 第一趟在a[0]~a[n-1]找出最大值,放在a[0]; 第二趟在a[1]~a[n-1]找出最大值,放在a[1]; …… 依此类推,直到从a[n-2]和a[n-1]之中找最大值

208 1. 选择排序法 算法描述: for( i=0; i<n-1; i ++ ) { * 从a[i]到a[n-1]中找最大元素a[t];
应用举例 1. 选择排序法 算法描述: for( i=0; i<n-1; i ++ ) { * 从a[i]到a[n-1]中找最大元素a[t]; 把 a [ t ] 与 a [ i ] 交换 } * 细化寻找最大元素算法: 每一趟寻找中,设变量 t,记录当前最大元素下标: for( j=i+1; j<n; j ++ ) if( a[j]>a[t] ) t=j;

209 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ;
应用举例 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i j t 1 49 38 a [ 1 ] < a [ 0 ] a [ 1 ] : a [ 0 ]

210 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 1 j
应用举例 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 1 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 2 2 49 65 a [ 2 ] > a [ 0 ] a [ 2 ] : a [ 0 ]

211 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 2 j
应用举例 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 2 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 3 3 65 a [ 3 ] > a [ 2 ] 97 a [ 3 ] : a [ 2 ]

212 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 3 j
应用举例 1. 选择排序法 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 3 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 4 a [ 4 ] < a [ 3 ] 97 a [ 4 ] : a [ 3 ] 76

213 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ;
应用举例 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 49 38 65 97 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 5 j 3 t 97 a [ 0 ] a [ 3 ] 49

214 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 5 j
应用举例 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] i 5 j 3 t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 1 2 2 1 38 65 a [ 2 ] > a [ 1 ] a [ 2 ] : a [ 1 ]

215 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 2
应用举例 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 2 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 3 65 a [ 3 ] < a [ 2 ] 49 a [ 3 ] : a [ 2 ]

216 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 3
应用举例 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 3 j 2 t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 4 4 65 a [ 4 ] > a [ 2 ] a [ 4 ] : a [ 2 ] 76

217 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 4
应用举例 1. 选择排序法 97 38 65 49 76 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 4 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 76 a [ 1 ] a [ 4 ] 38

218 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 5
应用举例 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 1 i 5 j 4 t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 2 3 2 65 a [ 3 ] < a [ 2 ] 49 a [ 3 ] : a [ 2 ]

219 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ;
应用举例 1. 选择排序法 for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 2 i 3 j t 4 65 a [ 4 ] < a [ 2 ] a [ 4 ] : a [ 2 ] 38

220 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 2 i 4
应用举例 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 2 i 4 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 65 a [ 2 ] a [ 2 ]

221 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 2 i 5
应用举例 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 2 i 5 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 3 4 3 a [ 4 ] < a [ 3 ] 49 a [ 4 ] : a [ 3 ] 38

222 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 3 i 5
应用举例 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 3 i 5 j t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } a [ 3 ] a [ 3 ] 49

223 1. 选择排序法 排序结束 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 4
应用举例 1. 选择排序法 97 76 65 49 38 a [ 0 ] a [ 1 ] a [ 2 ] a [ 3 ] a [ 4 ] 4 i 5 j 3 t for ( i = 0 ; i < n-1 ; i ++ ) // n = 4 { t = i ; for ( j = i + 1 ; j < n ; j ++ ) if ( a[ j ] > a [ t ] ) t = j ; 把 a [ t ] 与 a [ i ] 交换 } 排序结束

224 1. 选择排序法 // 例4-14 #include<iostream> #include<cstdlib>
应用举例 // 例4-14 #include<iostream> #include<cstdlib> #include<ctime> using namespace std ; void sort ( int [] , int ) ; int main() { int i, a [10] ; srand ( int( time( 0 ) ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出原始序列 cout << endl ; sort ( a , 10 ) ; //调用排序函数 cout << "Order1:" << endl ; for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出排序后序列 }

225 1. 选择排序法 // 例4-14 #include<iostream> #include<cstdlib>
应用举例 // 例4-14 #include<iostream> #include<cstdlib> #include<ctime> using namespace std ; void sort ( int [] , int ) ; int main() { int i, a [10] ; srand ( int( time( 0 ) ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出原始序列 cout << endl ; sort ( a , 10 ) ; //调用排序函数 cout << "Order1:" << endl ; for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出排序后序列 } 时间函数

226 1. 选择排序法 // 例4-14 #include<iostream> #include<cstdlib>
应用举例 // 例4-14 #include<iostream> #include<cstdlib> #include<ctime> using namespace std ; void sort ( int [] , int ) ; int main() { int i, a [10] ; srand ( int( time( 0 ) ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出原始序列 cout << endl ; sort ( a , 10 ) ; //调用排序函数 cout << "Order1:" << endl ; for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出排序后序列 } 种子函数

227 1. 选择排序法 // 例4-14 #include<iostream> #include<cstdlib>
应用举例 // 例4-14 #include<iostream> #include<cstdlib> #include<ctime> using namespace std ; void sort ( int [] , int ) ; int main() { int i, a [10] ; srand ( int( time( 0 ) ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出原始序列 cout << endl ; sort ( a , 10 ) ; //调用排序函数 cout << "Order1:" << endl ; for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出排序后序列 } 随机函数

228 1. 选择排序法 // 例4-14 #include<iostream> #include<cstdlib>
应用举例 // 例4-14 #include<iostream> #include<cstdlib> #include<ctime> using namespace std ; void sort ( int [] , int ) ; int main() { int i, a [10] ; srand ( int( time( 0 ) ) ) ; //调用种子函数 for ( i = 0 ; i < 10 ; i ++ ) a[i] = rand() % 100 ; //用随机函数初始化数组 for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出原始序列 cout << endl ; sort ( a , 10 ) ; //调用排序函数 cout << "Order1:" << endl ; for ( i = 0 ; i < 10 ; i ++ ) cout << a[ i ] << " " ; //输出排序后序列 } 调用自定义函数

229 1. 选择排序法 // sort void sort ( int x[] , int n ) { int max , t ;
应用举例 // sort void sort ( int x[] , int n ) { int max , t ; for ( int i = 0 ; i < n-1 ; i ++ ) //对数组排序 { t = i ; for ( int j = i + 1 ; j < n ; j ++ ) //寻找最大元素 if ( x [ j ] > x [ t ] ) t = j ; if ( t != i ) { max = x [ i ] ; //交换数组元素 x [ i ] = x [ t ] ; x [ t ] = max ; } return ; 升序用 < 比较

230 随机函数 线性同余法产生伪随机数序列公式: rk = ( M * rk-1 + K ) Mod A
应用举例 随机函数 线性同余法产生伪随机数序列公式: rk = ( M * rk K ) Mod A 例: rk = ( * rk )% 可以产生32767个各不相同的整型随机数 问题: 若r0 已知,则所有rk 可知 解决: 修改公式 r = ( M * N + K ) Mod A 其中:N称为种子值,由函数srand () 返回。

231 随机函数 Visual C++的标准库(stdlib.h)提供两个用于产生随机数的函数: rand()
应用举例 随机函数 Visual C++的标准库(stdlib.h)提供两个用于产生随机数的函数: rand() 随机函数。返回0~32767的随机值。该函数没有参数 srand ( number ) 种子函数。要求一个无符号整型参数置随机数生成器的启动值 为使种子值可变,用系统时间做srand函数的参数: time() 时间函数,在time.h定义。用0作参数时,返回系统当前时间

232 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 b [ 0 ] 49 38 65 97 76 13 27 52
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 b [ 0 ] 49 38 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 49 b [ 0 ] > b [ 1 ] 38 b [ 1 ]

233 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 b [ 0 ] 49 38 65 97 76 13 27 52
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 b [ 0 ] 49 38 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 b [ 0 ] > b [ 1 ] 49 b [ 1 ]

234 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 49 b [ 1 ] < b [ 2 ] 65

235 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 65 b [ 2 ] < b [ 3 ] 97

236 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 3 ] 97 b [ 3 ] > b [ 4 ] 76 b [ 4 ]

237 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 97 76 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 3 ] 76 b [ 3 ] > b [ 4 ] 97 b [ 4 ]

238 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 97 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 97 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 4 ] 97 b [ 4 ] > b [ 5 ] 13 b [ 5 ]

239 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 97 13 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 97 13 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 4 ] 13 b [ 4 ] > b [ 5 ] 97 b [ 5 ]

240 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 97 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 97 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 5 ] 97 b [ 5 ] > b [ 6 ] 27 b [ 6 ]

241 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 97 27 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 97 27 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 5 ] 97 b [ 5 ] > b [ 6 ] 27 b [ 6 ]

242 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 97 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 97 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 6 ] 97 b [ 6 ] > b [ 7 ] 52 b [ 7 ]

243 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 97 52 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 97 52 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] b [ 6 ] 52 b [ 6 ] > b [ 7 ] 97 b [ 7 ]

244 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7]

245 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 76 13 27 52 97 38 b [ 0 ] < b [ 1 ] 49

246 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 76 13 27 52 97 49 b [ 1 ] < b [ 2 ] 65

247 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 76 13 27 52 97 65 b [ 2 ] < b [ 3 ] 76

248 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 76 13 27 52 97 b [ 3 ] 76 b [ 3 ] > b [ 4 ] 13 b [ 4 ]

249 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 76 13 27 52 97 b [ 3 ] 13 b [ 3 ] > b [ 4 ] 76 b [ 4 ]

250 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 13 76 27 52 97 b [ 4 ] 76 b [ 4 ] > b [ 5 ] 27 b [ 5 ]

251 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 13 76 27 52 97 b [ 4 ] 27 b [ 4 ] > b [ 5 ] 76 b [ 5 ]

252 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 13 b [ 5 ] 27 76 76 b [ 5 ] > b [ 6 ] 52 52 b [ 6 ] 97

253 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 13 b [ 5 ] 27 52 76 b [ 5 ] > b [ 6 ] 76 52 b [ 6 ] 97

254 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0]
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 示例:对数组元素进行升序排列 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 49 65 13 27 52 76 97

255 2. 冒泡排序法 —— 采用相邻元素比较的方法 不需进行数据交换 示例:对数组元素进行升序排列 49 38 65 97 76 13 27
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 不需进行数据交换 示例:对数组元素进行升序排列 49 38 65 97 76 13 27 52 38 49 65 76 13 27 52 97 b[0] b[1] b[2] b[3] b[4] b[5] b[6] b[7] 38 38 49 13 27 52 65 76 97 38 13 27 49 52 65 76 97 13 27 38 49 52 65 76 97 13 27 38 49 52 65 76 97 13 27 38 49 52 65 76 97 49 65 13 27 52 76 97

256 2. 冒泡排序法 —— 采用相邻元素比较的方法 // bubble void bubble ( int a[] , int size )
应用举例 2. 冒泡排序法 —— 采用相邻元素比较的方法 // bubble void bubble ( int a[] , int size ) { int i , temp , work ; for ( int pass = 1 ; pass < size ; pass ++ ) //对数组排序 { work = 1 ; for ( i = 0 ; i < size-pass ; i ++ ) if ( a [ i ] > a [ i + 1 ] ) //相邻元素比较 { temp = a [ i ] ; a [ i ] = a [ i + 1 ] ; a [ i + 1 ] = temp ; work = 0 ; } if ( work ) break ; 辅助工作变量 监控相邻元素是否被交换

257 3. 矩阵相乘 设 A 为 m  n 的矩阵,B 为 n  l 的矩阵,求矩阵相乘 C = A  B 则 C 阵为 m  l 的矩阵
应用举例 3. 矩阵相乘 设 A 为 m  n 的矩阵,B 为 n  l 的矩阵,求矩阵相乘 C = A  B 则 C 阵为 m  l 的矩阵

258 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k c [ 0 ] [ 0 ] = 5 * 12 5 7 8 3 4 A 5 12 = C 12 3 4 2 6 7  B

259 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 c [ 0 ] [ 0 ] = 5 * 12 + 7 * 4 5 7 8 3 4 12 2 6 A  B = C 7 4 88

260 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 c [ 0 ] [ 1 ] = 5 * 3 5 7 8 3 4 A 5 = C 88 12 3 4 2 6 7  B 3

261 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 1 c [ 0 ] [ 1 ] = 5 * 3 + 7 * 2 5 7 8 3 4 12 2 6 A  B = C 7 88 29 2

262 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 c [ 0 ] [ 2 ] = 5 * 6 5 7 8 3 4 A 5 = C 88 29 12 3 4 2 6 7  B 6

263 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 1 c [ 0 ] [ 2 ] = 5 * 6 + 7 * 7 5 7 8 3 4 12 2 6 A  B = C 7 88 29 79 7

264 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i 1 j k c [ 1 ] [ 0 ] = 8 * 12 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 12 8

265 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 1 c [ 1 ] [ 0 ] = 8 * 12 + 3 * 4 5 7 8 3 4 12 2 6 A  B = C 88 29 79 3 108 4

266 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 1 c [ 1 ] [ 1 ] = 8 * 3 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 3 8 108

267 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 1 1 c [ 1 ] [ 1 ] = 8 * 3 + 3 * 2 5 7 8 3 4 12 2 6 A  B = C 88 29 79 3 108 30 2

268 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 2 c [ 1 ] [ 2 ] = 8 * 6 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 6 8 108 30

269 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 1 2 1 c [ 1 ] [ 2 ] = 8 * 6 + 3 * 7 5 7 8 3 4 12 2 6 A  B = C 88 29 79 3 108 30 69 7

270 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 c [ 2 ] [ 0 ] = 7 * 12 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 12 108 30 69 7

271 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 1 c [ 2 ] [ 0 ] = 7 * 12 + 4 * 4 5 7 8 3 4 12 2 6 A  B = C 88 29 79 108 30 69 4 4 100

272 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 1 c [ 2 ] [ 1 ] = 7 * 3 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 3 108 30 69 7 100

273 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 1 1 c [ 2 ] [ 1 ] = 7 * 3 + 4 * 2 5 7 8 3 4 12 2 6 A  B = C 88 29 79 108 30 69 2 4 100 29

274 i j k A = C  B for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 2 c [ 2 ] [ 2 ] = 7 * 6 5 7 8 3 4 A = C 88 29 79 12 3 4 2 6 7  B 6 108 30 69 7 100 29

275 i j k A  B = C for ( int i = 0 ; i < cm ; i + + )
应用举例 for ( int i = 0 ; i < cm ; i + + ) for ( int j = 0 ; j < cl ; j + + ) { for ( int k = 0 ; k < cn ; k + + ) c [ i ] [ j ] + = a [ i ] [ k ] * b[ k ] [ j ] } cm = 3 cl = 3 cn = 2 i j k 2 2 1 c [ 2 ] [ 2 ] = 7 * 6 + 4 * 7 5 7 8 3 4 12 2 6 A  B = C 88 29 79 108 30 69 7 4 100 29 70

276 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例

277 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 数据声明 它们是全局量

278 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 矩阵相乘的 函数原型

279 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 被运算矩阵 约束为只读

280 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 参数表 还有什么书写形式?

281 OK #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 OK bool multimatrix ( const int [ ][p], int , int , const int [ ][n], int , int , int [ ][n], int , int ) ;

282 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 bool multimatrix ( const int [ ][ ], int , int , const int [ ][ ], int , int , int [ ][n], int , int ) ; 不能缺省 低维长度

283 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 嵌套循环 输入 A 矩阵元素

284 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 嵌套循环 输入 B 矩阵元素

285 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 在判断表达式中 调用函数

286 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 如果条件为真 结束程序

287 #include<iostream> //例4-15 #include<iomanip>
using namespace std ; const int m = 4, p = 3, n = 2 ; int a[m][p] , b[p][n] , c[m][n] ; bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) ; int main() { int i , j ; cout << "Please input A:\n" ; //输入矩阵A元素 for ( i = 0 ; i < m ; i ++ ) for ( j = 0 ; j < p ; j ++ ) cin >> a[i][j] ; cout << "\nPlease input B:\n" ; //输入矩阵B元素 for ( i = 0 ; i < p ; i ++ ) for( j = 0; j<n; j++ ) cin >> b[i][j] ; if ( !multimatrix ( a , m , p , b , p , n , c , m , n ) ) //调用函数计算矩阵乘积 { cout << "illegal matrix multiply.\n" ; return ; } for ( i = 0 ; i < m ; i ++ ) //输出结果矩阵C { for ( j = 0 ; j < n ; j ++ ) cout << setw( 5 ) << c[i][j] ; cout << endl ; 应用举例 如果条件为假 输出结果矩阵

288 bool multimatrix ( const int a[m][p] , int arow , int acol ,
应用举例 bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) { if ( acol != brow ) return false ; //判断参数合法性 if ( crow != arow ) return false ; if ( ccol != bcol ) return false ; for ( int i = 0 ; i < crow ; i ++ ) //计算矩阵相乘 for ( int j = 0 ; j < ccol ; j ++ ) { for ( int n = 0 ; n < acol ; n ++ ) c [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ; } return true ;

289 bool multimatrix ( const int a[m][p] , int arow , int acol ,
应用举例 bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) { if ( acol != brow ) return false ; //判断参数合法性 if ( crow != arow ) return false ; if ( ccol != bcol ) return false ; for ( int i = 0 ; i < crow ; i ++ ) //计算矩阵相乘 for ( int j = 0 ; j < ccol ; j ++ ) { for ( int n = 0 ; n < acol ; n ++ ) c [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ; } return true ; 如果行或列 参数非法返回false

290 bool multimatrix ( const int a[m][p] , int arow , int acol ,
应用举例 bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) { if ( acol != brow ) return false ; //判断参数合法性 if ( crow != arow ) return false ; if ( ccol != bcol ) return false ; for ( int i = 0 ; i < crow ; i ++ ) //计算矩阵相乘 for ( int j = 0 ; j < ccol ; j ++ ) { for ( int n = 0 ; n < acol ; n ++ ) c [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ; } return true ; 参数合法计算矩阵相乘 然后返回 0

291 bool multimatrix ( const int *a , int arow , int acol ,
应用举例 修改函数参数: bool multimatrix ( const int *a , int arow , int acol , int * b , int brow , int bcol , int * c , int crow , int ccol ) ; 函数调用为: multimatrix ( *a , m, p , *b , p, n , *c , m, n ) multimatrix 函数体应该如何访问数组? bool multimatrix ( const int a[m][p] , int arow , int acol , const int b[p][n] , int brow , int bcol , int c[m][n] , int crow , int ccol ) { if ( acol != brow ) return false ; //判断参数合法性 if ( crow != arow ) return false ; if ( ccol != bcol ) return false ; for ( int i = 0 ; i < crow ; i ++ ) //计算矩阵相乘 for ( int j = 0 ; j < ccol ; j ++ ) { for ( int n = 0 ; n < acol ; n ++ ) c [ i ] [ j ] += a [ i ] [ n ] * b [ n ] [ j ] ; } return true ;

292

293 4.5 动态存储 C++的动态存储分配机制可以根据需要 在程序运行时建立和撤销对象

294 4.5.1 new 和 delete 操作符 new 运算符动态分配堆内存 指针变量 = new 类型[表达式];
作用:从堆分配一块“类型”大小的存储空间,返回首地址 其中:“常量”是初始化值,可缺省 创建数组对象时,不能为对象指定初始值 delete 运算符释放已分配的内存空间 使用形式: delete 指针变量 ; delete [] 指针变量 ; 其中:“指针变量”必须是一个 new 返回的指针

295 4.5.1 new 和 delete 操作符 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ;

296 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ;

297 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2

298 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3

299 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

300 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

301 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

302 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

303 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

304 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

305 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

306 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

307 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

308 4.5.1 new 和 delete 操作符 p1 int * p1 = new int ; char * p2 = new char ;
double * p3 = new double ; int * p4 = new int [4] ; …… delete p1 ; delete p2 ; delete p3 ; delete [] p4 ; p2 p3 p4

309

310 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream>
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; }

311 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p

312 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p 89

313 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
new 和 delete 操作符 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p 89

314 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p 89 对象无名 只能通过指针访问 89

315 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p 89 89

316 4.5.2 动态存储的应用 例4-16 用 new 算符建立简单对象 #include<iostream> p
动态存储的应用 new 和 delete 操作符 例4-16 用 new 算符建立简单对象 #include<iostream> using namespace std ; int main() { int * p = NULL ; p = new int ( 89 ) ; //初始化存储区 if ( p == NULL ) { cout << "allocation faiure\n"; return 1; } cout << *p ; delete p ; } p 89 89

317 4.5.2 动态存储的应用 例4-17-1 用 new 算符建立动态数组 #include<iostream>
动态存储的应用 new 和 delete 操作符 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; }

318 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 p t i 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; }

319 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } t

320 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } t

321 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t

322 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

323 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

324 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

325 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t 100 |

326 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t 100 |

327 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t 100 |

328 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

329 4.5.2 动态存储的应用 i p 例4-17-1 用 new 算符建立动态数组 #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i p 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

330 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

331 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

332 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

333 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

334 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

335 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

336 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

337 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

338 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

339 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

340 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

341 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t |

342 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 t

343 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 以下标方式 访问动态数组 t

344 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 i 是偏移量 p 指针本身值不变 t

345 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 跟踪指针赋初值 t

346 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 跟踪指针移动 t

347 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 间址访问元素 t

348 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 p #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 p #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 注意 结束循环后 for ( i = 0 ; i < 10 ; p ++, i++ ) cout << *p << " " ;

349 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 注意 结束循环后 for ( i = 0 ; i < 10 ; p ++, i++ ) cout << *p << " " ; p

350 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 #include<iostream>
动态存储的应用 new 和 delete 操作符 10 i 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 注意 结束循环后 释放什么空间? for ( i = 0 ; i < 10 ; p ++, i++ ) cout << *p << " " ; p

351 4.5.2 动态存储的应用 i 例4-17-1 用 new 算符建立动态数组 100 #include<iostream>
new 和 delete 操作符 动态存储的应用 10 i 例 用 new 算符建立动态数组 #include<iostream> using namespace std ; int main() { int * p = NULL , * t ; int i ; p = new int [10] ; if ( p == NULL ) { cout << "allocation faiure\n" ; return 1; } for ( i = 0 ; i < 10 ; i ++ ) p[i] = i ; cout << endl ; for ( t = p ; t < p+10 ; t ++ ) cout << *t << " " ; delete [] p ; } 100 101 102 103 104 105 106 107 108 109 注意 结束循环后 内存泄漏 for ( i = 0 ; i < 10 ; p ++, i++ ) cout << *p << " " ; p

352 #include<iostream> using namespace std ;
new 和 delete 操作符 例 调用函数建立动态数组 #include<iostream> using namespace std ; void App( int * & pa , int n ) ; int main() { int *ary = NULL, *t , i, n ; cout<<"n= "; cin>>n; App( ary, n ); for( i = 0; i<n; i++ ) {ary[i] = 10 + i ; cout<<ary[i]<<" "; } delete []ary; } void App( int * & pa , int len ) { pa = new int [len] ; if( pa == NULL ) { cout << "allocation faiure\n"; return ; } for( int i = 0; i<len; i++ ) pa[i] = 0 ;

353 App( ary, n ); 注意 int *&pa 例4-17-2 调用函数建立动态数组 #include<iostream>
new 和 delete 操作符 例 调用函数建立动态数组 #include<iostream> using namespace std ; void App( int * & pa , int n ) ; int main() { int *ary = NULL, *t , i, n ; cout<<"n= "; cin>>n; App( ary, n ); for( i = 0; i<n; i++ ) {ary[i] = 10 + i ; cout<<ary[i]<<" "; } delete []ary; } void App( int * & pa , int len ) { pa = new int [len] ; if( pa == NULL ) { cout << "allocation faiure\n"; return ; } for( int i = 0; i<len; i++ ) pa[i] = 0 ; ary pa App( ary, n ); 指针引用参数 注意 int *&pa

354 int * pa App( ary, n ); 注意 int * pa
new 和 delete 操作符 例 调用函数建立动态数组 #include<iostream> using namespace std ; void App( int * & pa , int n ) ; int main() { int *ary = NULL, *t , i, n ; cout<<"n= "; cin>>n; App( ary, n ); for( i = 0; i<n; i++ ) {ary[i] = 10 + i ; cout<<ary[i]<<" "; } delete []ary; } void App( int * & pa , int len ) { pa = new int [len] ; if( pa == NULL ) { cout << "allocation faiure\n"; return ; } for( int i = 0; i<len; i++ ) pa[i] = 0 ; ary pa int * pa App( ary, n ); 注意 int * pa

355 int * pa 讨论 App( ary, n ); int * pa
new 和 delete 操作符 例 调用函数建立动态数组 #include<iostream> using namespace std ; void App( int * & pa , int n ) ; int main() { int *ary = NULL, *t , i, n ; cout<<"n= "; cin>>n; App( ary, n ); for( i = 0; i<n; i++ ) {ary[i] = 10 + i ; cout<<ary[i]<<" "; } delete []ary; } void App( int * & pa , int len ) { pa = new int [len] ; if( pa == NULL ) { cout << "allocation faiure\n"; return ; } for( int i = 0; i<len; i++ ) pa[i] = 0 ; ary pa int * pa 讨论 形参 int *pa是传地址值参数 调用函数时实参ary的值(NULL)赋给形参变量pa 函数App执行new操作把地址写入pa,与ary无关 函数返回后,ary不能获得动态数组的地址 App( ary, n ); int * pa { pa = new int [len] ;

356 注意 指针引用参数的作用 例4-17-2 调用函数建立动态数组 #include<iostream>
new 和 delete 操作符 例 调用函数建立动态数组 #include<iostream> using namespace std ; void App( int * & pa , int n ) ; int main() { int *ary = NULL, *t , i, n ; cout<<"n= "; cin>>n; App( ary, n ); for( i = 0; i<n; i++ ) {ary[i] = 10 + i ; cout<<ary[i]<<" "; } delete []ary; } void App( int * & pa , int len ) { pa = new int [len] ; if( pa == NULL ) { cout << "allocation faiure\n"; return ; } for( int i = 0; i<len; i++ ) pa[i] = 0 ; ary pa 注意 指针引用参数的作用

357 例4-18 输出二项式系数表 ( a + b ) 0 = 1 ( a + b ) 1 = 1a + 1b
new 和 delete 操作符 例4-18 输出二项式系数表 ( a + b ) 0 = 1 ( a + b ) 1 = 1a + 1b ( a + b ) 2 = 1a2 + 2ab + 1b2 ( a + b ) 3 = 1a3 + 3a2b + 3ab2 + 1b3 ( a + b ) 4 = 1a4 + 4a3b + 6a2b2 + 4ab3 + 1b4 1 杨辉三角形

358 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 n 次系数表有 n +1 项 n 次系数表由 n -1 次系数表迭代生成: F0 = 1 Fn+1 = 1 Fi = Fi-1 + Fi

359 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5

360 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 0 1

361 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 1 1 1

362 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 2 1 1 1 +

363 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 2 1 2 1 +

364 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 3 1 2 1 1 +

365 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 3 1 2 3 1 +

366 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 3 1 2 3 1 +

367 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 3 1 3 3 1 +

368 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 3 3 1 1 +

369 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 3 3 4 1 +

370 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 3 3 4 1 +

371 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 3 6 4 1 +

372 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 3 6 4 1 +

373 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 4 1 4 6 4 1 +

374 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 4 1 1

375 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 4 1 1 +

376 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 4 5 1 +

377 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 4 5 1 +

378 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 10 5 1 +

379 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 6 10 5 1 +

380 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 10 10 5 1 +

381 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 4 10 10 5 1 +

382 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 5 10 10 5 1 +

383 new 和 delete 操作符 例4-18 输出二项式系数表 1 杨辉三角形 算法分析 一维数组迭代生成 n 次系数表 n = 5 F F F F F F5 n = 5 1 5 10 10 5 1

384 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

385 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 声明整型指针 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

386 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 限制输出幂次 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

387 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 创建动态数组 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

388 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 调用函数 求系数表 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

389 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 输出系数表 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

390 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 释放动态数组 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

391 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 约束形参指针只读 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

392 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 对第 1 项赋值 并保持不变 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

393 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 迭代各次系数表 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

394 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 添加最后 1 项 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

395 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 计算其余各项 void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

396 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; }

397 #include<iostream> using namespace std ;
new 和 delete 操作符 #include<iostream> using namespace std ; void yhtriangle( int * const, int ); int main() { int n , * yh ; do { cout << "Please input power:\n" ; cin >> n ; } while( n<0 || n>20 ) ; yh = new int [n+1] ; yhtriangle ( yh , n ) ; for ( int i = 0 ; i < n+1 ; i ++ ) cout << yh[i] << " " ; cout<<endl ; delete [] yh ; } 可以吗? 为什么? void yhtriangle ( int * const py, int pn ) { int i , j ; py[0] = 1 ; for ( i = 1; i < pn+1; i ++ ) { py [i] = 1; for ( j = i-1 ; j > 0 ; j -- ) py[j] = py[j-1] + py[j] ; } for ( j = 1 ;j < i ; j ++ )

398

399 4.6 字符数组与字符串 4.6.1 字符串存储 C++没有字符串类型,以字符数组作字符串: '\0' 为字符串结束标志
4.6 字符数组与字符串 字符串存储 C++没有字符串类型,以字符数组作字符串: '\0' 为字符串结束标志 '\0' 是ASCII码为0的不可显示字符,即“空操作符” 对字符数组以字符串常量进行初始化时,自动添加 '\0'

400 4.6.1 字符串存储 1.用字符数组存放字符串 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值:
字符串存储 1.用字符数组存放字符串 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值: char str1[10] = { 'S', 't', 'u', 'd', 'e', 'n', 't' } ;

401 4.6.1 字符串存储 1.用字符数组存放字符串 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值:
字符串存储 普通数组 不添加 '\0' 1.用字符数组存放字符串 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值: char str1[10] = { 'S', 't', 'u', 'd', 'e', 'n', 't' } ; S t u d e n

402 4.6.1 字符串存储 1.用字符数组存放字符串 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值: 用串常量初始化
字符串存储 1.用字符数组存放字符串 字符串 添加 '\0' 字符数组不同的初始化方式: 逐个字符对数组元素赋初始值: 用串常量初始化 char str2[10] = { "Student" } ; char str3[] = { "Student" } ; char str4[] = "Student" ; S t u d e n \0

403 4.6.1 字符串存储 2.用字符指针管理串 char *string = "Student" ; 操作: 建立匿名空间 ;
字符串存储 2.用字符指针管理串 string S t u d e n \0 char *string = "Student" ; 操作: 建立匿名空间 ; strcpy ( string , "Student" ) ;

404 4.6.1 字符串存储 2.用字符指针管理串 char * name [ 5 ]
字符串存储 2.用字符指针管理串 char * name [ 5 ] = { "Li Hua" , "He Xiao Ming" , "Zhang Li" , "Sun Fei" , "Chen Biao" } name [0] name [1] name [2] name [3] name [4] L i H u a \0 H e X i a o M i n g \0 Z h a n g L i \0 S u n F e i \0 C h e n B i a o \0

405

406 4.6.2 字符串的访问 iostream 对字符串的扩充功能: 字符串常量、字符数组名、字符指针都表示字符串
4.6.2 字符串访问 字符串的访问 iostream 对字符串的扩充功能: 字符串常量、字符数组名、字符指针都表示字符串 输出字符指针就是输出整个字符串(全部字符) 输出字符指针的间接引用是输出单个字符 基本操作中,串名是地址: 字符串名的直接比较是地址比较 字符串名赋值是赋地址值

407 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 }

408 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 数组初始化 没有结束符 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 }

409 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 可以正确显示字符串

410 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 找不到结束符 字符串后显示无意义符号

411 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } static char cb [10] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << cb [i] ; cout << endl ; cout << cb << endl ;

412 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 静态数组 自动对其余元素初始化为'\0' //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } static char cb [10] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << cb [i] ; cout << endl ; cout << cb << endl ;

413 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 都能够 正确输出字符串 static char cb [10] = { 'a' , 'b' , 'c', 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << cb [i] ; cout << endl ; cout << cb << endl ;

414 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } char cc[ ] = { 'i' , 'j' , 'k' , 'l' , 'm' , '\0' }; for ( int i = 0 ; i < sizeof( cc ) / sizeof( char )-1 ; i ++ ) cout << cc[i] ; cout << endl ; cout << cc << endl ;

415 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 添加结束符 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } char cc[ ] = { 'i' , 'j' , 'k' , 'l' , 'm' , '\0' }; for ( int i = 0 ; i < sizeof( cc ) / sizeof( char )-1 ; i ++ ) cout << cc[i] ; cout << endl ; cout << cc << endl ;

416 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 计算字节数 char cc[ ] = { 'i' , 'j' , 'k' , 'l' , 'm' , '\0' }; for ( int i = 0 ; i < sizeof( cc ) / sizeof( char )-1 ; i ++ ) cout << cc[i] ; cout << endl ; cout << cc << endl ;

417 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } char cd[ ] = "I am a student." ; for ( int i = 0 ; cd[i] != '\0' ; i ++ ) cout << cd[i] ; cout << endl ; cout << cd << endl ;

418 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 自动添加结束符 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } char cd[ ] = "I am a student." ; for ( int i = 0 ; cd[i] != '\0' ; i ++ ) cout << cd[i] ; cout << endl ; cout << cd << endl ;

419 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 检查串结束符 char cd[ ] = "I am a student." ; for ( int i = 0 ; cd[i] != '\0' ; i ++ ) cout << cd[i] ; cout << endl ; cout << cd << endl ;

420 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } char ce[10] ; cin >> ce ; cout << ce << endl ;

421 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 接受输入 空格或换行结束 char ce[10] ; cin >> ce ; cout << ce << endl ;

422 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 键盘输入 char ce[10] ; cin >> ce ; cout << ce << endl ;

423 4.6.2 字符串的访问 //例4-19 字符数组的访问 #include<iostream>
4.6.2 字符串访问 字符串的访问 //例4-19 字符数组的访问 #include<iostream> using namespace std ; int main() { char ca [5] = { 'a' , 'b' , 'c' , 'd' , 'e' } ; for ( int i = 0 ; i < 5 ; i ++ ) cout << ca [i] ; //逐个数组元素输出 cout << endl ; cout << ca << endl ; //整体输出字符数组 } 输出显示 char ce[10] ; cin >> ce ; cout << ce << endl ;

424 4.6.2 字符串的访问 // 例4-20 字符指针表示串 #include<iostream>
4.6.2 字符串访问 字符串的访问 // 例4-20 字符指针表示串 #include<iostream> using namespace std ; int main() { char *s = "program" ; for ( int i = 0 ; i < 7 ; i ++ ) cout << * ( s + i ) ; cout << endl ; }

425 4.6.2 字符串的访问 // 例4-20 字符指针表示串 #include<iostream>
4.6.2 字符串访问 字符串的访问 // 例4-20 字符指针表示串 #include<iostream> using namespace std ; int main() { char *s = "program" ; for ( int i = 0 ; i < 7 ; i ++ ) cout << * ( s + i ) ; cout << endl ; } 建立匿名对象 s p r o g a m \0

426 4.6.2 字符串的访问 // 例4-20 字符指针表示串 #include<iostream>
4.6.2 字符串访问 字符串的访问 // 例4-20 字符指针表示串 #include<iostream> using namespace std ; int main() { char *s = "program" ; for ( int i = 0 ; i < 7 ; i ++ ) cout << * ( s + i ) ; cout << endl ; } s p r o g a m \0

427 4.6.2 字符串的访问 注意修改后的输出 // 例4-20 字符指针表示串 为什么? #include<iostream>
4.6.2 字符串访问 字符串的访问 注意修改后的输出 为什么? // 例4-20 字符指针表示串 #include<iostream> using namespace std ; int main() { char *s = "program" ; for ( int i = 0 ; i < 7 ; i ++ ) cout << * ( s + i ) ; } s p r o g a m \0 cout << ( s + i ) << endl ;

428 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-21 指针数组表示的字符串 #include<iostream> using namespace std ; int main() { char *name[5] = { "Li Hua", "He Xiao Ming", "Zhang Li", "Sun Fei", "Chen Bao" }; for ( int i = 0 ; i < 5 ; i ++ ) cout << name[i] << endl ; } L i H u a \0 H e X i a o M i n g \0 Z h a n g L i \0 S u n F e i \0 C h e n B i a o \0 name [0] name [1] name [2] name [3] name [4]

429 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-21 指针数组表示的字符串 #include<iostream> using namespace std ; int main() { char *name[5] = { "Li Hua", "He Xiao Ming", "Zhang Li", "Sun Fei", "Chen Bao" }; for ( int i = 0 ; i < 5 ; i ++ ) cout << name[i] << endl ; } 字符指针 输出串值 L i H u a \0 H e X i a o M i n g \0 Z h a n g L i \0 S u n F e i \0 C h e n B i a o \0 name [0] name [1] name [2] name [3] name [4]

430 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; }

431 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } c o m p u t e r \0 str1 sp str2

432 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r

433 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0

434 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0

435 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0

436 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0 n e w s t r i g \0

437 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0 n e w s t r i g \0

438 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0 n e w s t r i g \0

439 #include<iostream> using namespace std ; int main()
4.6.2 字符串访问 // 例4-22 串的赋值 #include<iostream> using namespace std ; int main() { char str1[10] = "computer" , str2[10] , *sp ; int i = 0 ; while( str1[i] ) { str2[i] = str1[i++]; } str2[i] = '\0' ; sp = str1 ; cout << str1 << endl << str2 << endl << sp << endl; sp = "new string" ; cout << sp << endl ; } sp c o m p u t e r \0 str1 str2 c o m p u t e r \0 n e w s t r i g \0

440

441 4.6.3 字符串处理函数 cstring 函数 说明 strlen (Str ) 求串长。 strcpy_s( Des, Src )
字符串处理函数 cstring 函数 说明 strlen (Str ) 求串长。 strcpy_s( Des, Src ) strcpy_s( Des, DesSize, Src ) 串复制。 DesSize指定Des的要求长度。 strcat_s( Des, Src ) strcat_s( Des, DesSize,Src ) 串连接。 strncat_s( Des, Src, Count ) strncat_s( Des, DesSize, Src,Count ) Count指定Src子串。 strcmp( Str1, Str2 ) strncmp( Str1, Str2, MaxCount ) 串比较。 MaxCount指定比较子串长度。

442 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-23 测试字符串长度 #include<cstring> #include<iostream> using namespace std; int main() { char str1[] = "How do you do !"; char *str2 = "We write "; cout << "The string1 length is : " << strlen( str1 ) << endl; cout << "The string2 length is : " << strlen( str2 ) << endl; cout << "The string3 length is : " << strlen( "C++ program" ) << endl; }

443 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-23 测试字符串长度 #include<cstring> #include<iostream> using namespace std; int main() { char str1[] = "How do you do !"; char *str2 = "We write "; cout << "The string1 length is : " << strlen( str1 ) << endl; cout << "The string2 length is : " << strlen( str2 ) << endl; cout << "The string3 length is : " << strlen( "C++ program" ) << endl; } 字符数组

444 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-23 测试字符串长度 #include<cstring> #include<iostream> using namespace std; int main() { char str1[] = "How do you do !"; char *str2 = "We write "; cout << "The string1 length is : " << strlen( str1 ) << endl; cout << "The string2 length is : " << strlen( str2 ) << endl; cout << "The string3 length is : " << strlen( "C++ program" ) << endl; } 字符指针

445 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-23 测试字符串长度 #include<cstring> #include<iostream> using namespace std; int main() { char str1[] = "How do you do !"; char *str2 = "We write "; cout << "The string1 length is : " << strlen( str1 ) << endl; cout << "The string2 length is : " << strlen( str2 ) << endl; cout << "The string3 length is : " << strlen( "C++ program" ) << endl; } 字符串常量

446 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-24 复制字符串 #include<cstring> #include<iostream> using namespace std; int main() { char str1[20], *str2 ; str2=new char[20]; strcpy_s( str1, "computer world" ); strcpy_s( str2, 15, str1 ); cout << str1 << endl << str2 << endl << endl; }

447 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-24 复制字符串 #include<cstring> #include<iostream> using namespace std; int main() { char str1[20], *str2 ; str2=new char[20]; strcpy_s( str1, "computer world" ); //把串常量复制到字符数组str1 strcpy_s( str2, 15, str1 ); cout << str1 << endl << str2 << endl << endl; } str1是字符数组

448 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-24 复制字符串 #include<cstring> #include<iostream> using namespace std; int main() { char str1[20], *str2 ; str2=new char[20]; strcpy_s( str1, "computer world" ); //把串常量复制到字符数组str1 strcpy_s( str2, 15, str1 ); //把串str1复制到str2,要求长度15 cout << str1 << endl << str2 << endl << endl; } str2是字符指针 要求串长15

449 #include<cstring> #include<iostream> using namespace std;
4.6.3 字符串处理函数 //例4-24 复制字符串 #include<cstring> #include<iostream> using namespace std; int main() { char str1[20], *str2 ; str2=new char[20]; strcpy_s( str1, "computer world" ); //把串常量复制到字符数组str1 strcpy_s( str2, 15, str1 ); //把串str1复制到str2,要求长度15 cout << str1 << endl << str2 << endl << endl; }

450 #include<cstring> //例4-25 字符串连接 #include<iostream>
4.6.3 字符串处理函数 #include<cstring> //例4-25 字符串连接 #include<iostream> using namespace std; int main() { char str1[30], str2[10]; char *str3 = new char[30]; strcpy_s( str1, 30,"computer_" ); strcpy_s( str2, "world_" ); strcat_s( str1, "world_" ); cout << str1 << endl; strncat_s( str1,str2, 3 ); str3[0]='\0'; strncat_s( str3,30,str1,10); cout << str3 << endl; }

451 #include<cstring> //例4-25 字符串连接 #include<iostream>
4.6.3 字符串处理函数 #include<cstring> //例4-25 字符串连接 #include<iostream> using namespace std; int main() { char str1[30], str2[10]; char *str3 = new char[30]; strcpy_s( str1, 30,"computer_" ); strcpy_s( str2, "world_" ); strcat_s( str1, "world_" ); //把串常量添加到字符数组str1之后 cout << str1 << endl; strncat_s( str1,str2, 3 ); str3[0]='\0'; strncat_s( str3,30,str1,10); cout << str3 << endl; }

452 #include<cstring> //例4-25 字符串连接 #include<iostream>
4.6.3 字符串处理函数 #include<cstring> //例4-25 字符串连接 #include<iostream> using namespace std; int main() { char str1[30], str2[10]; char *str3 = new char[30]; strcpy_s( str1, 30,"computer_" ); strcpy_s( str2, "world_" ); strcat_s( str1, "world_" ); //把串常量添加到字符数组str1之后 cout << str1 << endl; strncat_s( str1,str2, 3 ); //把str2的3个字符添加到str1之后 str3[0]='\0'; strncat_s( str3,30,str1,10); cout << str3 << endl; }

453 #include<cstring> //例4-25 字符串连接 #include<iostream>
4.6.3 字符串处理函数 #include<cstring> //例4-25 字符串连接 #include<iostream> using namespace std; int main() { char str1[30], str2[10]; char *str3 = new char[30]; strcpy_s( str1, 30,"computer_" ); strcpy_s( str2, "world_" ); strcat_s( str1, "world_" ); //把串常量添加到字符数组str1之后 cout << str1 << endl; strncat_s( str1,str2, 3 ); //把str2的3个字符添加到str1之后 str3[0]='\0'; strncat_s( str3,30,str1,10); //把str1的10个字符添加到str3 cout << str3 << endl; }

454 #include<cstring> //例4-25 字符串连接 #include<iostream>
4.6.3 字符串处理函数 #include<cstring> //例4-25 字符串连接 #include<iostream> using namespace std; int main() { char str1[30], str2[10]; char *str3 = new char[30]; strcpy_s( str1, 30,"computer_" ); strcpy_s( str2, "world_" ); strcat_s( str1, "world_" ); //把串常量添加到字符数组str1之后 cout << str1 << endl; strncat_s( str1,str2, 3 ); //把str2的3个字符添加到str1之后 str3[0]='\0'; strncat_s( str3,30,str1,10); //把str1的10个字符添加到str3 cout << str3 << endl; }

455 //例4-26 用串比较函数查找指定串 #include<cstring> #include<iostream>
4.6.3 字符串处理函数 //例4-26 用串比较函数查找指定串 #include<cstring> #include<iostream> using namespace std; int main() { char *name[5] = { "LiHua", "HeXiaoMing", "ZhangLi", "SunFei", "ChenBao" }; char in_name[20]; int i, flag = 0; cout << "Enter your name: " ; cin >> in_name ; for( i = 0; i<5; i++ ) if ( strcmp( name[i], in_name ) == 0 ) { flag = 1; break; } if ( flag == 1 ) cout << in_name << " is in our class.\n"; else cout << in_name << " is not in our class.\n"; }

456 //例4-26 用串比较函数查找指定串 返回值 相等: 0 大于: 1 小于: -1 #include<cstring>
4.6.3 字符串处理函数 //例4-26 用串比较函数查找指定串 #include<cstring> #include<iostream> using namespace std; int main() { char *name[5] = { "LiHua", "HeXiaoMing", "ZhangLi", "SunFei", "ChenBao" }; char in_name[20]; int i, flag = 0; cout << "Enter your name: " ; cin >> in_name ; for( i = 0; i<5; i++ ) if ( strcmp( name[i], in_name ) == 0 ) { flag = 1; break; } if ( flag == 1 ) cout << in_name << " is in our class.\n"; else cout << in_name << " is not in our class.\n"; } 返回值 相等: 大于: 小于: -1

457 //例4-26 用串比较函数查找指定串 #include<cstring> #include<iostream>
4.6.3 字符串处理函数 //例4-26 用串比较函数查找指定串 #include<cstring> #include<iostream> using namespace std; int main() { char *name[5] = { "LiHua", "HeXiaoMing", "ZhangLi", "SunFei", "ChenBao" }; char in_name[20]; int i, flag = 0; cout << "Enter your name: " ; cin >> in_name ; for( i = 0; i<5; i++ ) if ( strcmp( name[i], in_name ) == 0 ) { flag = 1; break; } if ( flag == 1 ) cout << in_name << " is in our class.\n"; else cout << in_name << " is not in our class.\n"; }

458 #include <cstdio> int main() { char *s = new char[128];
4.6.3 字符串处理函数 //例4-27 包含空格的字符串输入输出 #include <cstdio> int main() { char *s = new char[128]; gets_s( s,10 ); //输入字符串长度<10 puts( s ); delete []s; s = NULL ; } 头文件

459 char *gets_s( char * _Buf, size_t _Size );
4.6.3 字符串处理函数 //例4-27 包含空格的字符串输入输出 #include <cstdio> int main() { char *s = new char[128]; gets_s( s,10 ); //输入字符串长度<10 puts( s ); delete []s; s = NULL ; } char *gets_s( char * _Buf, size_t _Size );

460 int puts( const char * _Str );
4.6.3 字符串处理函数 //例4-27 包含空格的字符串输入输出 #include <cstdio> int main() { char *s = new char[128]; gets_s( s,10 ); //输入字符串长度<10 puts( s ); delete []s; s = NULL ; } int puts( const char * _Str );

461 #include <cstdio> int main() { char *s = new char[128];
4.6.3 字符串处理函数 //例4-27 包含空格的字符串输入输出 #include <cstdio> int main() { char *s = new char[128]; gets_s( s,10 ); //输入字符串长度<10 puts( s ); delete []s; s = NULL ; }

462

463 小结 数组以线性关系组织对象。一个n维数组的每个元素是n-1维数组。 数组元素以下标表示它在数组中的位置,称为下标变量。
使用指针数组,可以管理复杂的对象,例如字符串、函数以及类对象。 数组占有一片连续的存储空间。数组名表示这片存储空间的首地址。 使用new和delete算符能够动态地申请和收回内存空间。 C++可以把字符指针作为“字符串变量”使用,实现对字符串的“名”访问。 string是C++预定义的类,它提供了对字符串更安全和方便的操作。 排序、查找、比较、复制等是数组的常用操作。

464


Download ppt "第4章 数组 数组是由一定数目的同类元素顺序排列而成的结构类型数据 一个数组在内存占有一片连续的存储区域 数组名是存储空间的首地址"

Similar presentations


Ads by Google