指针的使用:
测试代码1:
#include "date.h"
#include <stdio.h> // 加法函数
int add(int a, int b) { return a + b;
} // 减法函数
int subtract(int a, int b) { return a - b;
} // 定义一个指向接收两个int参数并返回int的函数
typedef int (*FuncPtr)(int, int); // 定义一个函数,接收一个指向函数的指针和两个整数作为参数
void applyFunction(FuncPtr func, int x, int y) { int result = func(x, y); printf("Result: %d\n", result);
} int main() { int time = getTime(); // 调用applyFunction并传递add函数作为参数 applyFunction(add, 5, 3); // 调用applyFunction并传递subtract函数作为参数 applyFunction(subtract, 9, 12); return 0;
}
运行结果如下:
测试代码2:
#include "date.h"
#include <stdio.h>
#include <string.h>
int main() { int time = getTime();// 声明字符指针并初始化 const char *ptr = "Hello, World!"; // 不能直接修改ptr指向的字符串(因为是字符串常量), char str[50] = "C programming"; char *ptr2 = str; // ptr2 现在指向 str printf("String pointed by ptr: %s\n", ptr); // 使用字符指针和标准库函数 strcpy(ptr2, "New programming language"); printf("After strcpy: %s\n", ptr2); // 通过指针算术访问和修改字符串 ptr2[5] = 'S'; // 修改字符 printf("Modified string: %s\n", ptr2); return 0;
}
运行结果如下:
测试代码3:
#include "date.h"
#include <stdio.h>
// 自定义 strcpy 函数
void my_strcpy(char *dest, const char *src) { // 遍历源字符串,直到遇到空字符 while (*src != '\0') { // 将源字符串的当前字符复制到目标字符串 *dest = *src; // 移动指针到下一个字符 dest++; src++; } // 在目标字符串的末尾添加空字符 *dest = '\0';
} int main() { int time = getTime();char source[] = "Hello, World!"; char destination[50]; // 确保目标数组足够大以容纳源字符串 // 使用自定义的 strcpy 函数复制字符串 my_strcpy(destination, source); // 输出复制后的字符串 printf("Copied string: %s\n", destination); return 0;
}
运行结果如下:
测试代码4:
#include "date.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h> int main() { int time = getTime();// 使用字符数组存储字符串 char strArray[50] = "Hello, World from an array!"; // 访问和修改字符数组中的元素 printf("Original string in array: %s\n", strArray); strArray[7] = 'C'; // 修改数组中的字符 printf("Modified string in array: %s\n", strArray); // 使用字符指针和动态内存分配存储可修改的字符串 char *dynamicStr = (char *)malloc(50 * sizeof(char)); // 分配内存 if (dynamicStr != NULL) { strcpy(dynamicStr, "Hello, World from dynamically allocated memory!"); // 访问动态分配的字符串 printf("String from dynamic memory: %s\n", dynamicStr); // 修改动态分配的字符串 dynamicStr[7] = 'E'; printf("Modified string from dynamic memory: %s\n", dynamicStr); // 释放动态分配的内存 free(dynamicStr); } else { // 如果内存分配失败 printf("Memory allocation failed!\n"); } // 不要访问dynamicStr,已经被释放了 return 0;
}
运行结果如下:
测试代码5:
#include "date.h"
#include <stdio.h>
// 指针数组特别适用于处理字符串数组、动态数据结构(如链表和树)中的节点指针等场景。
int main() { int time = getTime();// 定义并初始化整型指针数组 int a = 10, b = 20, c = 30; int *intArr[3] = {&a, &b, &c}; // 访问并修改整型指针数组指向的值 for(int i = 0; i < 3; i++) { printf("Original %d: %d\n", i, *(intArr[i])); *(intArr[i]) += 10; // 将每个值增加10 } // 再次访问并打印修改后的值 printf("\nModified values:\n"); for(int i = 0; i < 3; i++) { printf("%d ", *(intArr[i])); } printf("\n"); // 定义并初始化字符串指针数组 const char *strArr[3] = {"Hello", "World", "!"}; // 遍历并打印字符串指针数组中的每个字符串 printf("\nString array:\n"); for(int i = 0; i < 3; i++) { printf("%s ", strArr[i]); } printf("\n"); return 0;
}
运行结果如下:
测试代码6:
#include "date.h"
#include <stdio.h>
#include <string.h>// 快速排序的分区函数
int partition(const char *arr[], int low, int high) {const char *pivot = arr[high]; // 选择最后一个元素作为基准int i = low - 1; // 较小元素的索引for (int j = low; j <= high - 1; j++) {// 如果当前元素小于或等于pivotif (strcmp(arr[j], pivot) >= 0) {i++; // 移动较小元素的索引// 交换arr[i]和arr[j]const char *temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}// 交换arr[i+1]和arr[high](或pivot)const char *temp = arr[i + 1];arr[i + 1] = arr[high];arr[high] = temp;return (i + 1);
}// 快速排序函数
void quickSort(const char *arr[], int low, int high) {if (low < high) {// pi是分区后基准的索引int pi = partition(arr, low, high);// 分别对基准前后的子数组进行排序quickSort(arr, low, pi - 1);quickSort(arr, pi + 1, high);}
}// 查找并返回最小字符串的索引(不需要,因为数组已排序)
int findMinStringIndex(const char *arr[], int n) {return 0; // 排序后,最小字符串在索引0处
}int main() {int time = getTime();// 初始化字符串指针数组const char *strings[] = {"banana", "apple", "cherry", "date"};int n = sizeof(strings) / sizeof(strings[0]);// 排序字符串quickSort(strings, 0, n - 1);// 打印排序后的字符串printf("Sorted strings (from largest to smallest):\n");for (int i = 0; i < n; i++) {printf("%s\n", strings[i]);}// 由于已经排序,所以最小字符串就是第一个printf("The smallest string is: %s\n", strings[0]);return 0;
}
运行结果如下: