C语言基础(十四)

指针的使用:

测试代码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++) {
        // 如果当前元素小于或等于pivot
        if (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;
}

运行结果如下:

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值