第6章 数组、指针与字符串(二) 6.2.6 用指针访问数组元素
数组是一组连续存储的同类型数据,可以通过指针的算术运算,使指针依次指向数组的各个元素,进而可以遍历数组。 定义指向数组元素的指针 ● 定义与赋值
例:int a[10], *pa; pa=&a[0];或 pa=a; ● 等效的形式
■ 经过上述定义及赋值后
*pa就是a[0],*(pa+1) 就是a[1],... *(pa+i) 就是a[i]。 a[i],*(pa+i),*(a+i),pa[i]都是等效的。 ● 注意
■ 不能写 a++,因为a是数组首地址、是常量。 例6-7
设有一个int型数组a,有10个元素。用三种方法输出各元素: ● 使用数组名和下标 ● 使用数组名和指针运算 ● 使用指针变量
例6-7 (1) 使用数组名和下标访问数组元素
//例6_7 (1) 使用数组名和下标访问数组元素.cpp(P205) #include
int main() {
}
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; for (int i = 0; i < 10; i++) cout << a[i] << \; cout << endl;
return 0;
运行结果:
例6-7 (2) 使用数组名和指针运算访问数组元素
//例6_7 (2) 使用数组名和指针运算访问数组元素.cpp(P205) #include
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; for (int i = 0; i < 10; i++) cout << *(a+i) << \; cout << endl;
return 0; }
运行结果:
例6-7 (3) 使用指针变量访问数组元素
//例6_7 (3) 使用指针变量访问数组元素.cpp(P206)
#include
int main() {
int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }; for (int *p = a; p < (a + 10); p++) cout << *p << \; cout << endl;
return 0;
}
运行结果:
6.2.7 指针数组 ● 数组的元素是指针型
例6-8 利用指针数组存放矩阵
//例6_8 利用指针数组存放矩阵源.cpp(P207) #include
int main() {
int line1[] = { 1, 0, 0 }; //定义数组,矩阵的第一行 int line2[] = { 0, 1, 0 }; //定义数组,矩阵的第二行 int line3[] = { 0, 0, 1 }; //定义数组,矩阵的第三行
//定义整型指针数组并初始化
int *pLine[3] = { line1, line2, line3 };
cout << \ << endl; //输出单位矩阵 for (int i = 0; i < 3; i++) {
//对指针数组元素循环
for (int j = 0; j < 3; j++) //对矩阵每一行循环
cout << pLine[i][j] << \; cout << endl; }
return 0; }
输出结果为:
指针数组与二维数组对比
● 对比例6-8中的指针数组和如下二维数组
int array2[3][3] ={ { 1,0,0 }, { 0,1,0 }, { 0,0,1 } };
例6-9 二维数组举例
//例6_9 二维数组举例.cpp(P208)
#include
int main() {
int array2[3][3]= { { 11, 12, 13 }, { 21, 22, 23 }, { 31, 32, 33 } }; for(int i = 0; i < 3; i++) {
}
for(int j = 0; j < 3; j++)
cout << *(*(array2 + i) + j) << \;//逐个输出二维数组第i行元素值
cout << endl; }
return 0;
运行结果:
指针与函数
6.2.8 以指针作为函数参数 为什么需要用指针做参数?
● 需要数据双向传递时(引用也可以达到此效果)
■ 用指针作为函数的参数,可以使被调函数通过形参指针存取主调函数中实参指针指向的数据,实现数据的双向传递
● 需要传递一组数据,只传首地址运行效率比较高 ■ 实参是数组名时形参可以是指针
例6-10 读入三个浮点数,将整数部分和小数部分分别输出
//例6_10 读入三个浮点数,将整数部分和小数部分分别输出.cpp(P209) #include
//将实数x分成整数部分和小数部分,形参intpart、fracpart是指针 void splitFloat(float x, int *intPart, float *fracPart) { }
*intPart = static_cast
//取x的小数部分