指针的应用

基本指针操作

指针是存储另一个变量地址的变量

#include <stdio.h>

int main() {
    int a = 10;
    int *p = &a; // 定义一个指针变量p,并使其指向a的地址

    printf("a的值: %d\n", a);
    printf("a的地址: %p\n", (void*)&a);
    printf("指针p的值(即a的地址): %p\n", (void*)p);
    printf("通过指针p访问a的值: %d\n", *p);

    return 0;
}

在这个示例中:

  1. int *p 声明一个指向整数的指针。
  2. p = &a 让指针 p 指向变量 a 的地址。
  3. *p 通过指针访问 a 的值。

动态内存分配

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n, i;
    printf("输入数组大小: ");
    scanf("%d", &n);

    int *arr = (int*) malloc(n * sizeof(int)); // 动态分配内存
    if (arr == NULL) {
        printf("内存分配失败\n");
        return 1;
    }

    for (i = 0; i < n; i++) {
        arr[i] = i + 1;
    }

    printf("数组元素: ");
    for (i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    free(arr); // 释放内存
    return 0;
}

在这个示例中:

  1. malloc 函数分配 n 个整数的内存空间。
  2. free 函数释放已分配的内存,防止内存泄漏。

处理字符串

#include <stdio.h>

int main() {
    char str[] = "Hello, World!";
    char *p = str;

    printf("字符串: %s\n", str);

    printf("使用指针遍历字符串: ");
    while (*p != '\0') {
        printf("%c", *p);
        p++;
    }
    printf("\n");

    return 0;
}

字符数组 str 保存字符串。
指针 p 指向字符串的第一个字符,通过指针遍历字符串直到遇到终止符 ‘\0’。

函数指针

#include <stdio.h>

void add(int a, int b) {
    printf("Add: %d\n", a + b);
}

void subtract(int a, int b) {
    printf("Subtract: %d\n", a - b);
}

int main() {
    void (*operation)(int, int);

    operation = &add; // 指向add函数
    operation(5, 3);

    operation = &subtract; // 指向subtract函数
    operation(5, 3);

    return 0;
}

void (*operation)(int, int) 声明一个指向返回类型为 void,参数为 int, int 的函数的指针。
operation = &add 使指针指向 add 函数,并调用该函数。

访问硬件寄存器

#define REGISTER_ADDRESS 0x40021000
#define REGISTER (*(volatile unsigned int *)REGISTER_ADDRESS)

int main() {
    REGISTER = 0x01; // 设置寄存器的值
    unsigned int value = REGISTER; // 读取寄存器的值
    printf("寄存器的值: 0x%X\n", value);

    return 0;
}

#define REGISTER (*(volatile unsigned int *)REGISTER_ADDRESS) 定义一个指向寄存器地址的指针,并强制类型转换为 volatile unsigned int 类型。
REGISTER = 0x01 设置寄存器的值。
unsigned int value = REGISTER 读取寄存器的值。

链表操作

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} Node;

// 在链表开头插入节点
void push(Node** head_ref, int new_data) {
    Node* new_node = (Node*) malloc(sizeof(Node));
    new_node->data = new_data;
    new_node->next = (*head_ref);
    (*head_ref) = new_node;
}

// 打印链表
void printList(Node* node) {
    while (node != NULL) {
        printf(" %d ", node->data);
        node = node->next;
    }
}

int main() {
    Node* head = NULL;

    push(&head, 1);
    push(&head, 2);
    push(&head, 3);

    printf("链表内容: ");
    printList(head);

    return 0;
}

Node 结构体定义了链表节点。
push 函数在链表开头插入新节点。
printList 函数遍历并打印链表中的所有节点。

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值