1.1任务描述
使用指针编写一个程序,输入10个整数存入数组,将数组元素逆置后输出。
1.2.相关知识
数组逆置的算法思想:第一个数组元素和倒数第一个数组元素交换,第二个和倒数第二个交换,依次进行下去,直到交换的两个数组元素相遇。
1.3.测试说明
平台会对你编写的代码进行测试:
测试输入:10 5 1 2 3 4 5 6 7 8
预期输出:8 7 6 5 4 3 2 1 5 10
按头歌上面给的代码写的,显得复杂了些,
int main()
{
void inv(int* x, int n);
int i , a[10];
//1.输入10个数组元素
for (i = 0; i < 10; i++)
{
scanf("%d", &a[i]);
}
printf("\n");
//实现逆置函数,
inv(a, 10);//把首元素地址传过去,把数组元素传过去
//3.打印
for (i = 0; i < 10; i++)
{
printf("%d ", a[i]);
}
return 0;
}
void inv(int* x, int n)
{
int* p;
int temp;
int* i;
int* j;
int m = (n - 1) / 2;
i = x; j = x + n - 1; p = x + m;
for (; i <= p; i++, j--)
{
temp = *i;
*i = *j;
*j = temp;
}
return 0;
}
2.1任务描述
编写程序,利用指针方法求数组的最大值和最小值。
2.2擂台赛算法思想
求最大值的擂台赛算法思想:从数组中任意找一个数组元素作为擂主,默认是最大值,遍历数组,将每个数组元素依次和擂主比较,如果比擂主大就将这个数组元素的值赋给擂主,否则就离开,直至最后一个数组元素,即可得出擂主就是最大值。
为了完成本关任务,需要定义一个指针变量指向任意一个数组元素,擂主是指针变量指向的数组元素,遍历数组,将每个数组元素依次和指针变量指向的数组元素比较。如果大就将这个数组元素的地址赋给指针变量,否则指针变量的值不变,直至最后一个数组元素,即可得出指针变量指向的数组元素为最大。
求最小值的算法思想与求最大值的算法思想一致。
2.3测试说明
测试输入:
4
91
51
预期输出:
min=4
max=91
#define M 3
int main()
{
int a[M], i;
int* max, * min;
int j = 0;
for (i = 0; i < M; i++)
{
scanf("%d", &a[i]);
}
//把最大值的指针先指向首元素地址
max = &a[0];
//把数组元素依次与max指针指向的最大值比较
for (i = 1; i < M; i++)
{
if (*max < a[i])
{
max = &a[i];
}
}
printf("max=%d\n", *max);
//最小值先指向首元素地址
min = &a[0];
for (i = 1; i < M; i++)
{
if (a[i] < *min)
{
min = &a[i];
}
}
printf("min=%d\n", *min);
return 0;
}
运行结果如下:
注意点:因为我们使用的是指针,所以如果比max大的话,直接把较大的地址直接给max,而不需要去想把max地址加几去等于要指向更大值的地址,显得有点愚蠢了,最开始我就是去想
max+=多少 等于我指向的比较之后的较大数呢 ?就会产生一系列问题,因为是逐一比较的,较大值不是固定的,加几显然无法确定,会越想越复杂,显然把问题复杂化了。
3.利用指针数组求二维数组各行元素之和
3.1任务描述
本关任务:编写程序,利用指针数组求 3 * 5 数组各行元素之和。
3.2相关知识
指针数组
一个数组的元素值为指针变量则称该数组是指针数组,即指针数组是一组有序的指针变量的集合。指针数组的所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。指针数组说明的一般形式为:
类型说明符 *数组名[数组长度]
其中类型说明符为指针值所指向的变量的类型。例如:
int *p[3];
表示p
是一个指针数组,它有三个数组元素,每个元素值都是一个指向整型变量的指针变量。
除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子:
#include <stdio.h>
int main()
{
int a = 16, b = 92, c = 100;
int *p[3] = {&a, &b, &c}; //定义一个指针数组并且初始化
printf("%d, %d, %d\n", *p[0], *p[1], *p[2]);
return 0;
}
执行结果如下: 16, 92, 100
分析:程序中,p
是一个指针数组,它包含了3
个元素p[0]
,p[1]
,p[2]
,每个元素都是一个指针类型。在定义p
数组的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。printf()
语句中,p[i]
表示获取第i
个元素的值,该元素是一个指针,还需要在前面增加一个*
才能取得它指向的数据,也即*p[i]
的形式。
3.3测试说明
测试输入: 54 21 36 58 4 78 46 2 35 47 69 28 91 51 32
预期输出:
第0行和为:173
第1行和为:208
第2行和为:271
#define N 3
#define M 5
int main()
{
int a[N][M];
int* p[N];
int i, j, sum;
for (i = 0; i < N; i++)
{
for (p[i] = a[i];p[i] < a[i] + M; p[i]++)
{
scanf("%d", p[i]);
}
}
for (i = 0; i < N; i++)
{
sum = 0;
for (p[i] = a[i]; p[i] < a[i] + M; p[i]++)
{
sum += *p[i];
}
printf("第%d行和为:%d\n", i, sum);
}
return 0;
}
运行结果如下: