前言:更多内容请看总纲《嵌入式C/C++学习路》
编写程序把一个数组中的所有内容前后颠倒(要求使用指针完成)
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
// 定义两个指针,分别指向数组的第一个和最后一个元素
int *p_pre = arr, *p_post = arr + 6;
printf("*p_pre = %d,*p_post = %d\n", *p_pre, *p_post);
while (p_pre < p_post)
{
*p_pre += *p_post;
*p_post = *p_pre - *p_post;
*p_pre = *p_pre - *p_post;
p_pre++; // 交换完后往后移动一个元素
p_post--; // 往前移动一个元素
}
for (p_pre = arr; p_pre <= arr + 6; p_pre++)
{
printf("%d ", *p_pre);
}
printf("\n");
return 0;
}
编写程序从一个大数组中查找另一个小数组,把查找到的所有起点打印在屏幕上
#include <stdio.h>
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7, 3, 4, 6, 7, 3, 4, 5};
int arr1[] = {3, 4, 5};
// 思路:假设arr中的每个位置都是arr1的开始位置
int *p_cur = NULL, *p_arr1 = NULL; // p_cur代表arr前面的11个位置,p_arr1代表arr1要比较的位置
for (p_cur = arr; p_cur <= arr + 11; p_cur++)
{
for (p_arr1 = arr1; p_arr1 <= arr1 + 2; p_arr1++)
{
// arr1也是3的地址,假设p_arr1是arr1中4的地址,那么p_arr1-arr1=1,
// 那么本来是p_cur指向的元素与arr1的3元素比较,现在进行加1,即arr中p_cur + 1与arr1中的4元素比较
if (*(p_arr1 - arr1 + p_cur) != *p_arr1)
{
break; // 如果出现元素不相等,退出for循环
}
}
if (!(p_arr1 <= arr1 + 2)) // 如果循环正常结束,即在arr中找到了arr1
{
printf("位置%d是一个查找结果\n", p_cur - arr); // 打印下标
}
}
return 0;
}