(3)实验实例
1)编写程序,实现2 个数值的交换,要求必须用指针和自定义函数来实现。
【程序分析】
①输入2 个数值、函数调用和结果输出等功能留在main 函数中。
②一般一个自定义函数只能返回一个数据结果,如果一个函数要求返回的数据结果有2个或者2 个以上,就可以使用指针的方式来实现。因为指针的作用之一:已知某数据在内存中的地址,即可以实现利用指针实现对该数据的间接访问。
【参考程序】


【运行结果】如图10-1所示。

图10-1 程序运行结果
2)输入一个寝室6 位同学的身高,从低到高排序输出。要求:必须用指针的方式实现,其中排序功能必须要书写为自定义函数。
【程序分析】
①此题把数组定义、输入、函数调用和输出放在main 函数中。
②一位数组与指针的关系是已知数组首元素的首地址,从而可以开始依次访问该数组中的每个数组元素。例如:每个数组元素的地址是&a[0]、&a[1]、&a[1]……。因为数组元素在内存中是连续存储,所以上述每个数组元素的地址等价于&a[0]、&a[0] +1、&a[1] +2……。数组元素的值是*(&a[0])、*(&a[0] +1)、*(&a[1] +2)……。
③然后利用一个指针变量p 来存储&a[0],则数组元素的值是*(p +0)、*(p +1)、*(p+2)……。
【参考程序】





【运行结果】如图10-2所示。

图10-2 程序运行结果
3)输入3 行4 列矩阵a 的所有值,求得并输出其对应的转置矩阵。
【程序分析】(https://www.daowen.com)
①因为矩阵数据呈现的是二维,所以此题将使用二位数组来解决问题。
②将输入功能、函数调用、输出功能在main 函数中实现。
③所谓转置就是数据的行列互换。
④二维数组中指针的关系是:*(a + i) + j 等价&a[i][j],也就是a[i][j]的地址。*(*(a+i) +j)等价a[i][j],也就是a[i][j]的值。
⑤因为二维数组的数组名也就是a 等价&a[0],所以数组名a 亦是地址也就是指针,但是它指向的是整个首行,也就是指向一个长度为4 的一位数组,因此此题要用指向数组的指针来实现。例如:int (*p)[4]; 此定义的含义是定义了一个p 指针变量,它指向的是一个长度为4 的一维数组。
【参考程序】


【运行结果】如图10-3所示。

图10-3 程序运行结果
4)输入一段英文,统计其中英文字符、数字字符、空格字符和其他字符等四大类字符的个数。
【程序分析】
①首先需要一个一维字符数组来存储一段英文。
②将输入功能、函数调用、输出功能在main 函数中实现。
③字符数组与指针的关系是:如有代码char str[1000]; 则有str +i 等价于&str[i],也就是str 数组中第i 个数组元素的地址。则有*(str+i)等价于str[i],也就是str 数组中第i 个数组元素的值。
④因为输入的英文长度不确定,也可以使用malloc 函数实现程序中所需的存储空间立即划分。
【参考程序】




【运行结果】如图10-4所示。

图10-4 程序运行结果