基本指针操作
指针是存储另一个变量地址的变量
#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;
}
在这个示例中:
- int *p 声明一个指向整数的指针。
- p = &a 让指针 p 指向变量 a 的地址。
- *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;
}
在这个示例中:
- malloc 函数分配 n 个整数的内存空间。
- 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 函数遍历并打印链表中的所有节点。