C语言指针详解
文章目录
- 1. 什么是指针?
- 1.1 直观理解
- 2. 指针的基本语法
- 2.1 声明指针
- 2.2 指针的赋值
- 3. 指针的核心操作
- 3.1 解引用(访问指针指向的值)
- 3.2 指针的算术运算
- 3.3 指针与数组
- 4. 指针的常见用途
- 4.1 动态内存分配
- 4.2 函数参数传递
- 4.3 字符串操作
- 5. 指针的常见错误
- 6. 实战练习
- 7. 总结
1. 什么是指针?
- 指针(Pointer) 是C语言中存储变量内存地址的特殊变量。理解指针是掌握C语言内存管理和高效编程的核心。
1.1 直观理解
普通变量直接保存数据(如 int a = 10;)
-
指针变量保存的是其他变量的内存地址(如 a 的地址是 0x7ffd34)
类比: -
指针就像一张快递取件码,告诉你包裹(数据)存放在哪个储物柜(内存地址)中。
2. 指针的基本语法
2.1 声明指针
数据类型 *指针变量名; // * 表示这是一个指针变量
示例:
int *p; // 指向整型的指针
char *c; // 指向字符的指针
float *f; // 指向浮点数的指针
2.2 指针的赋值
int a = 10;
int *p = &a; // & 取地址符,获取a的地址
注意:
*p 表示指针 p 指向的值(即 a 的值 10)
p 存储的是 a 的地址(如 0x7ffd34)
3. 指针的核心操作
3.1 解引用(访问指针指向的值)
int a = 10;
int *p = &a;
printf("%d\n", *p); // 输出 10(通过指针访问a的值)
*p = 20; // 通过指针修改a的值
printf("%d\n", a); // 输出 20
3.2 指针的算术运算
- 指针可以进行++、–、+、-运算,单位是数据类型大小(如 int 指针每次移动4字节):
int arr[3] = {10, 20, 30};
int *p = arr; // p 指向 arr[0]
printf("%d\n", *p); // 输出 10
p++; // 移动到下一个元素 arr[1]
printf("%d\n", *p); // 输出 20
3.3 指针与数组
数组名本质是指向数组首元素的指针:
int arr[3] = {1, 2, 3};
printf("%d\n", *(arr + 1)); // 等价于 arr[1],输出 2
4. 指针的常见用途
4.1 动态内存分配
使用 malloc 和 free 管理堆内存:
int *p = (int*) malloc(5 * sizeof(int)); // 分配5个int的内存
if (p == NULL) {printf("内存分配失败!\n");return 1;
}
p[0] = 100; // 像数组一样使用
free(p); // 释放内存
4.2 函数参数传递
C语言默认值传递,用指针可实现引用传递:
void increment(int *ptr) {(*ptr)++; // 修改原始变量的值
}
int main() {int num = 5;increment(&num); // 传递num的地址printf("%d\n", num); // 输出 6return 0;
}
4.3 字符串操作
C语言字符串本质是字符指针:
char *str = "Hello"; // 字符串字面量存储在常量区
printf("%s\n", str); // 输出 Hello
5. 指针的常见错误
错误类型
示例代码 | 导致问题 |
---|---|
未初始化指针 | int *p; *p = 10; 访问非法内存(段错误) |
悬空指针 | free§;printf(“%d”, *p); 访问已释放的内存(崩溃) |
类型不匹配 | int *p; float f=1.2; p=&f; 数据解释错误(未定义行为) |
- 安全建议:
始终初始化指针(如 int *p = NULL;)
避免指针越界访问
释放后指针置NULL(free§; p = NULL;)
6. 实战练习
练习1:交换两个变量的值
void swap(int *a, int *b) {int temp = *a;*a = *b;*b = temp;
}
int main() {int x = 10, y = 20;swap(&x, &y);printf("x=%d, y=%d\n", x, y); // 输出 x=20, y=10return 0;
}
练习2:使用指针遍历数组
int main() {int arr[] = {5, 2, 8, 1, 6};int *p = arr;for (int i = 0; i < 5; i++) {printf("%d ", *(p + i)); // 输出 5 2 8 1 6}return 0;
}
7. 总结
- 指针是C语言的灵魂,掌握它才能高效管理内存和复杂数据结构。
关键概念:
✔️ & 取地址符
✔️ * 解引用/指针声明
✔️ 指针运算
✔️ 动态内存管理
实践建议:多写代码调试,理解地址与值的关系。
进阶方向:指向指针的指针(int **pp)、函数指针、结构体指针等。