|
|
【C语言入门】指针完全指南 - 看完这篇再也不怕指针
什么是指针?
指针就是一个变量,它存储的是另一个变量的内存地址。
基本语法:
int a = 42; // 普通变量,存储值42
int *p = &a; // 指针变量,存储a的地址
两个关键运算符:
& 取地址符 - 获取变量的内存地址
* 解引用符 - 获取地址上存储的值
示例一:指针基础用法
#include <stdio.h>
int main() {
int a = 10;
int *p = &a;
printf("a的值: %d\n", a); // 输出: 10
printf("a的地址: %p\n", &a); // 输出: 0x7ffd...
printf("p的值: %p\n", p); // 输出: 和&a一样
printf("*p的值: %d\n", *p); // 输出: 10
// 通过指针修改a的值
*p = 20;
printf("修改后a的值: %d\n", a); // 输出: 20
return 0;
}
示例二:指针与数组
#include <stdio.h>
int main() {
int arr[] = {10, 20, 30, 40, 50};
int *p = arr; // 数组名就是首元素地址
for (int i = 0; i < 5; i++) {
printf("arr[%d] = %d\n", i, *(p + i));
}
return 0;
}
示例三:用指针交换两个数
#include <stdio.h>
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int main() {
int x = 5, y = 10;
printf("交换前: x=%d, y=%d\n", x, y);
swap(&x, &y);
printf("交换后: x=%d, y=%d\n", x, y);
return 0;
}
示例四:动态内存分配
#include <stdio.h>
#include <stdlib.h>
int main() {
int n = 5;
int *arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("内存分配失败!\n");
return 1;
}
for (int i = 0; i < n; i++) {
arr[i] = (i + 1) * 10;
printf("arr[%d] = %d\n", i, arr[i]);
}
free(arr); // 一定要释放内存!
return 0;
}
新手常犯的错误:
错误1:未初始化的指针
int *p; // 危险!p指向随机地址
*p = 10; // 可能导致程序崩溃
正确做法:
int *p = NULL; // 先置空
p = &a; // 再赋值
错误2:野指针
int *p = (int *)malloc(sizeof(int));
free(p);
*p = 10; // 错误!p指向的内存已释放
错误3:内存泄漏
int *p = (int *)malloc(sizeof(int));
// 忘记free(p),内存永远不会释放
指针速查表:
int *p; // 指向int的指针
int **pp; // 指向指针的指针
int arr[5]; // arr本质上是指向首元素的指针
void (*func)(int); // 指向函数的指针
练习题:写一个函数,用指针找出数组中的最大值。
void find_max(int *arr, int size, int *max) {
*max = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > *max)
*max = arr[i];
}
}
搞懂指针,C语言就算入门了!有问题欢迎回帖讨论! |
|