26-c语言指针定义和使用
本文最后更新于 2026-02-28,文章内容可能已经过时。
指针是C语言的核心机制,用于直接操作内存地址以实现高效数据访问和管理。定义时需指定类型(如
int *p;),初始化使用取地址符&(如p = &a;),通过解引用符*(如*p)访问指针指向的值。常见应用包括通过指针修改实参(如函数参数传递)、遍历数组、实现函数回调等。使用时需严格避免野指针(未初始化指针)和空指针(NULL解引用),确保指针类型匹配,且指针运算的步长与所指数据类型大小一致(如int *指针+1移动4字节)。正确运用指针能显著提升程序效率,但误用易导致内存错误或程序崩溃。
一、指针的基本概念
指针是C语言的核心特性之一,它通过直接操作内存地址赋予程序高效的内存访问能力。指针本质上是一个变量,其值是另一个变量在内存中的地址,而不是变量的值本身。
关键点:
- 指针存储的是内存地址,通过地址可以间接访问和修改数据
- 指针是C语言的精华所在,也是学习C语言的难点
- 指针让程序能够高效地管理内存,减少数据复制开销
二、指针的定义
指针的定义语法:
数据类型 *指针变量名;
示例:
int *p_int; // 定义指向整型的指针
float *p_float; // 定义指向浮点型的指针
char *p_char; // 定义指向字符型的指针
重要说明:
*是指针声明的一部分,不是操作符- 数据类型表示指针指向的数据类型
- 指针变量名前的
*表示这是一个指针变量
三、指针的初始化
指针的初始化通常使用取地址运算符&:
int a = 10;
int *p = &a; // 将a的地址赋给指针p
正确初始化:
int a = 10;
int *p = &a; // 良好习惯
int *p = NULL; // 也推荐使用NULL初始化
错误初始化:
int *p = 10; // 错误!不能将数值直接赋给指针
四、指针的操作
1. 取地址运算符 &
- 用于获取变量的内存地址
- 例如:
&a获取变量a的地址
2. 解引用运算符 *
- 用于访问指针指向的内存数据
- 例如:
*p获取指针p指向的变量的值
示例:
int a = 10;
int *p = &a;
printf("%d\n", *p); // 输出10
*p = 20; // 将a的值改为20
五、指针的常见应用
1. 通过指针修改实参的值
C语言函数参数传递是值传递,通过指针可以修改实参的值:
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=10
return 0;
}
2. 返回多个计算结果
通过指针参数返回多个结果:
void calc(int a, int b, int *sum, int *diff) {
*sum = a + b;
*diff = a - b;
}
int main() {
int s, d;
calc(30, 12, &s, &d);
printf("和:%d, 差:%d\n", s, d); // 输出:和:42, 差:18
return 0;
}
3. 数组操作
通过指针遍历数组:
int arr[5] = {1, 2, 3, 4, 5};
int *p = arr; // 指向数组首元素
for (int i = 0; i < 5; i++) {
printf("%d ", *(p + i)); // 输出:1 2 3 4 5
}
4. 函数指针
指向函数的指针,实现回调机制:
int add(int a, int b) { return a + b; }
int subtract(int a, int b) { return a - b; }
int main() {
int (*func_ptr)(int, int) = add;
printf("2+3=%d\n", func_ptr(2, 3)); // 输出:2+3=5
func_ptr = subtract;
printf("2-3=%d\n", func_ptr(2, 3)); // 输出:2-3=-1
return 0;
}
六、指针的注意事项
-
野指针:未初始化的指针,指向随机地址,可能导致程序崩溃
int *p; // 未初始化的野指针 *p = 10; // 错误!访问未知内存 -
空指针:指针指向NULL地址,解引用会导致错误
int *p = NULL; *p = 10; // 错误!不能解引用NULL指针 -
指针类型匹配:不同类型指针不能直接赋值
int *p_int; char *p_char; p_int = p_char; // 不推荐,可能导致问题 -
指针运算:指针加减运算的步长等于指向数据类型的大小
int arr[5] = {1, 2, 3, 4, 5}; int *p = arr; p++; // 指针指向arr[1],地址增加4字节(假设int占4字节)
七、指针的常见类型
-
普通指针:指向具体数据类型的指针
int *p; // 指向整型的指针 -
指针的指针:指向指针的指针
int **pp; // 指向整型指针的指针 -
数组指针:指向数组的指针
int (*p)[5]; // 指向包含5个整型元素的数组的指针 -
指针数组:数组中的元素是指针
int *p[5]; // 包含5个指向整型的指针的数组 -
函数指针:指向函数的指针
int (*func_ptr)(int, int); // 指向接受两个整型参数并返回整型的函数
八、总结
指针是C语言的核心概念,也是C语言高效性的关键。正确使用指针可以:
- 高效地管理内存
- 实现数据共享
- 提高程序效率
- 实现复杂的程序结构
但使用不当也可能导致严重错误,如内存泄漏、野指针、指针越界等。因此,学习指针时,需要特别注意:
- 指针必须初始化
- 避免野指针
- 正确理解指针类型
- 仔细检查指针运算
通过理解指针的本质——内存地址,以及熟练掌握指针的定义、初始化和操作,就能掌握C语言中这一重要特性,为编写高效、可靠的C程序打下坚实基础。
- 感谢你赐予我前进的力量

