C语言指针

指针详解

指针是C语言中最强大的特性之一,允许直接访问和操作内存。

指针的主要特点:

  • 指针基础
  • 指针运算
  • 指针和数组
  • 多级指针
  • 函数指针
  • 动态内存分配
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 函数声明
void swap(int *a, int *b);
void printArray(int *arr, int size);
int* createArray(int size);
void freeArray(int *arr);
void sortArray(int *arr, int size);
int* findMax(int *arr, int size);
void reverseString(char *str);
void printMatrix(int **matrix, int rows, int cols);
int** createMatrix(int rows, int cols);
void freeMatrix(int **matrix, int rows);

// 函数指针类型定义
typedef int (*CompareFunc)(int, int);

int main() {
    // 基本指针操作
    printf("基本指针操作示例:\n");
    int num = 42;
    int *ptr = #
    printf("num的值:%d\n", num);
    printf("ptr指向的值:%d\n", *ptr);
    printf("num的地址:%p\n", (void*)&num);
    printf("ptr存储的地址:%p\n", (void*)ptr);
    
    // 指针运算
    printf("\n指针运算示例:\n");
    int arr[] = {1, 2, 3, 4, 5};
    int *p = arr;
    printf("数组元素:");
    for (int i = 0; i < 5; i++) {
        printf("%d ", *(p + i));
    }
    printf("\n");
    
    // 指针和数组
    printf("\n指针和数组示例:\n");
    printArray(arr, 5);
    
    // 指针作为函数参数
    printf("\n指针作为函数参数示例:\n");
    int a = 5, b = 10;
    printf("交换前:a = %d, b = %d\n", a, b);
    swap(&a, &b);
    printf("交换后:a = %d, b = %d\n", a, b);
    
    // 动态内存分配
    printf("\n动态内存分配示例:\n");
    int *dynamicArr = createArray(5);
    if (dynamicArr != NULL) {
        for (int i = 0; i < 5; i++) {
            dynamicArr[i] = i + 1;
        }
        printf("动态数组:");
        printArray(dynamicArr, 5);
        freeArray(dynamicArr);
    }
    
    // 多级指针
    printf("\n多级指针示例:\n");
    int **matrix = createMatrix(3, 3);
    if (matrix != NULL) {
        // 初始化矩阵
        for (int i = 0; i < 3; i++) {
            for (int j = 0; j < 3; j++) {
                matrix[i][j] = i * 3 + j + 1;
            }
        }
        printf("3x3矩阵:\n");
        printMatrix(matrix, 3, 3);
        freeMatrix(matrix, 3);
    }
    
    // 函数指针
    printf("\n函数指针示例:\n");
    CompareFunc compare = (CompareFunc)strcmp;
    int result = compare(5, 3);
    printf("比较结果:%d\n", result);
    
    // 字符串操作
    printf("\n字符串操作示例:\n");
    char str[] = "Hello, World!";
    printf("原始字符串:%s\n", str);
    reverseString(str);
    printf("反转后字符串:%s\n", str);
    
    // 指针数组
    printf("\n指针数组示例:\n");
    char *strings[] = {"Hello", "World", "C", "Programming"};
    int numStrings = sizeof(strings) / sizeof(strings[0]);
    printf("字符串数组:\n");
    for (int i = 0; i < numStrings; i++) {
        printf("%s\n", strings[i]);
    }
    
    // 常量指针
    printf("\n常量指针示例:\n");
    const int constant = 100;
    const int *constPtr = &constant;
    printf("常量值:%d\n", *constPtr);
    
    // void指针
    printf("\nvoid指针示例:\n");
    void *voidPtr = #
    printf("void指针指向的值:%d\n", *(int*)voidPtr);
    
    return 0;
}

// 函数定义
void swap(int *a, int *b) {
    int temp = *a;
    *a = *b;
    *b = temp;
}

void printArray(int *arr, int size) {
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int* createArray(int size) {
    return (int*)malloc(size * sizeof(int));
}

void freeArray(int *arr) {
    free(arr);
}

void sortArray(int *arr, int size) {
    for (int i = 0; i < size - 1; i++) {
        for (int j = 0; j < size - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                swap(&arr[j], &arr[j + 1]);
            }
        }
    }
}

int* findMax(int *arr, int size) {
    if (size <= 0) return NULL;
    
    int *max = &arr[0];
    for (int i = 1; i < size; i++) {
        if (arr[i] > *max) {
            max = &arr[i];
        }
    }
    return max;
}

void reverseString(char *str) {
    int length = strlen(str);
    for (int i = 0; i < length / 2; i++) {
        char temp = str[i];
        str[i] = str[length - i - 1];
        str[length - i - 1] = temp;
    }
}

void printMatrix(int **matrix, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%3d ", matrix[i][j]);
        }
        printf("\n");
    }
}

int** createMatrix(int rows, int cols) {
    int **matrix = (int**)malloc(rows * sizeof(int*));
    if (matrix == NULL) return NULL;
    
    for (int i = 0; i < rows; i++) {
        matrix[i] = (int*)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) {
            freeMatrix(matrix, i);
            return NULL;
        }
    }
    return matrix;
}

void freeMatrix(int **matrix, int rows) {
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
}