C语言指针实验
一、实验目的
1、掌握C语言指针相关知识
2、运用指针操作数组,操作字符串匹配序列。
二、实验设备与器件
PC机、头歌实践教学平台
三、实验内容
使用头歌平台编程:

(一)设计题目
1、编写一个函数,输入一个整型数组和数组长度,将数组中的元素倒序存放。要求不能使用另外的数组,只能通过指针操作来实现。
C程序1: |
#include <stdio.h> void reverse(int arr[], int len){ /***********begin********/ int *p1 = arr; int *p2 = arr+len-1; while(p1<p2){ int temp = *p1; *p1 = *p2; *p2 = temp; p1++; p2--; } /**********end***********/ } int main(){ int arr[5] = {1, 2, 3, 4, 5}; int len = 5; reverse(arr, len); int i; for(i=0;i<len;i++){ printf("%d ", arr[i]); } return 0; }
 |
2、编写一个函数,输入一个字符串和一个模式串,判断字符串中是否包含模式串。其中,模式串中可以包含通配符“*”,表示可以匹配任意字符序列。要求不能使用字符串相关的库函数,只能通过指针操作来实现。
C程序2: |
#include <stdio.h> int match(char *pstr, char *ppat){ /***********begin********/ char *p1 = pstr; char *p2 = ppat; char *last_p1 = NULL; char *last_p2 = NULL; while(*p1!='\0'){ if(*p1==*p2 || *p2=='*'){ p1++; p2++; if(*p2=='*'){ last_p1 = p1; last_p2 = p2; } } else{ if(last_p1==NULL){ return 0; } else{ p1 = last_p1+1; p2 = last_p2+1; last_p1 = p1; } } }
 |
3、编写一个函数,找出一个整型数组中的最大值和最小值,并将其存储在指定的变量中。
C程序3: |
#include <stdio.h> void find_max_min(int *arr, int n, int *max, int *min) { /***********begin********/ *max = *min = arr[0]; for (int i = 1; i < n; i++) { if (arr[i] > *max) { *max = arr[i]; } if (arr[i] < *min) { *min = arr[i]; } } /**********end***********/ } int main() { int arr[] = {1, 2, 3, 4, 5}; int n = sizeof(arr) / sizeof(arr[0]); int max, min; find_max_min(arr, n, &max, &min); printf("Max value: %d\n", max); printf("Min value: %d\n", min); return 0; }
 |
4、编写一个函数,判断一个字符串是否为回文字符串。
C程序4: |
#include <stdio.h> #include <string.h> int is_palindrome(char *str) { /***********begin********/ int len = strlen(str); for (int i = 0; i < len / 2; i++) { if (str[i] != str[len-1-i]) { return 0; } } return 1; /**********end***********/ } int main() { char str[100]; scanf("%s",&str); if (is_palindrome(str)) { printf("The string is a palindrome.\n"); } else { printf("The string is not a palindrome.\n"); } return 0; }


 |
5、指针与数组
编写一个函数,接受一个整型数组和它的长度作为参数,返回数组中最大值的指针。
C程序5: |
#include <stdio.h> int *max(int arr[], int len) { /***********begin********/ int *p = &arr[0]; for (int i = 1; i < len; i++) { if (arr[i] > *p) { p = &arr[i]; } } return p; /**********end***********/ } int main() { int n; scanf("%d",&n); int a[n]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } int *p = max(a, n); printf("%d",*p); return 0; }
 |
6、逆序排序
编程一个程序,它可以输出一条“Hello World”的消息
C程序6: |
#include <stdio.h> void reverse(int *arr[], int len) { /***********begin********/ int *p; for (int i = 0, j = len - 1; i < j; i++, j--) { p = arr[i]; arr[i] = arr[j]; arr[j] = p; } /**********end***********/ } int main() { int arr[] = {4, 5, 2, 8, 1, 3}; int len = sizeof(arr) / sizeof(arr[0]); int *pArr[len]; for (int i = 0; i < len; i++) { pArr[i] = &arr[i]; } printf("逆序前的数组为:"); for (int i = 0; i < len; i++) { printf("%d ", *pArr[i]); } printf("\n"); reverse(pArr, len); printf("逆序后的数组为:"); for (int i = 0; i < len; i++) { printf("%d ", *pArr[i]); } printf("\n"); return 0; }
 |
7、数组合并
编写一个函数,接受两个整型数组和它们的长度作为参数,将这两个数组合并成一个新的数组,并返回新数组的指针。
C程序7: |
#include <stdio.h> #include <stdlib.h> int *merge(int arr1[], int arr2[], int len1, int len2) { /***********begin********/ int *p = (int *)malloc(sizeof(int) * (len1 + len2)); if (p == NULL) { return NULL; } int i, j, k; for (i = 0; i < len1; i++) { p[i] = arr1[i]; } for (j = 0, k = i; j < len2; j++, k++) { p[k] = arr2[j]; } return p; /**********end***********/ } int main() { int arr1[] = {1, 3, 5, 7}; int arr2[] = {2, 4, 6, 8}; int len1 = sizeof(arr1) / sizeof(arr1[0]); int len2 = sizeof(arr2) / sizeof(arr2[0]); int *p = merge(arr1, arr2, len1, len2); printf("合并后的数组为:"); for (int i = 0; i < len1 + len2; i++) { printf("%d ", *(p + i)); } printf("\n"); free(p); return 0; }
 |
8、指针的使用
编写一个函数,接受两个整型指针作为参数,交换它们所指向的变量的值。
C程序8: |
#include <stdio.h> void swap(int *a, int *b) { /***********begin********/ int temp = *a; *a = *b; *b = temp; /**********end***********/ } int main() { int a,b; scanf("%d%d",&a,&b); swap(&a,&b); printf("%d,%d",a,b); return 0; }


 |