Download presentation
Presentation is loading. Please wait.
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的全部元素值
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
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
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 )
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 ) << " " ; }
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 } ;
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 ; 应用举例 如果条件为假 输出结果矩阵