C语言指针是保存内存地址的变量,通过指针可以直接访问和修改内存中的数据。掌握指针用法对理解C语言内存模型和提升代码效率非常关键。下面介绍几种常见且实用的指针用法。

1. 指针的定义与基本使用
使用星号声明指针,用取地址符<code>&</code>获取变量地址,用星号解引用访问指向的值。
#include <stdio.h>
int main() {
int a = 10;
int *p = &a; // p保存a的地址
printf("a=%dn", *p); // 解引用输出10
*p = 20; // 通过指针修改a
printf("a=%dn", a);
return 0;
}
2. 指针与数组
数组名本身代表首元素地址,指针可以像数组下标一样遍历元素。
#include <stdio.h>
int main() {
int arr[3] = {1, 2, 3};
int *p = arr; // 等价于 &arr[0]
for (int i = 0; i < 3; i++) {
printf("%d ", *(p + i));
}
return 0;
}
3. 指针作为函数参数
把指针传给函数,可以在函数内部修改外部变量的值,实现双向数据传递。
#include <stdio.h>
void swap(int *x, int *y) {
int t = *x;
*x = *y;
*y = t;
}
int main() {
int a = 1, b = 2;
swap(&a, &b);
printf("a=%d b=%dn", a, b);
return 0;
}
4. 指针运算
指针支持加减整数,移动步长由指向类型大小决定,常用于数组遍历。
- p + 1 移动到下一个同类型元素
- p++ 指向下一个元素
- 两个同数组指针相减得到元素个数差
5. 函数指针与指针函数
指针函数是返回指针的函数;函数指针是指向函数的指针,可用于回调。
#include <stdio.h>
int add(int x, int y) { return x + y; }
int main() {
int (*fp)(int, int) = add; // 函数指针
printf("sum=%dn", fp(3, 4));
return 0;
}
6. 多级指针
指向指针的指针称为二级指针,常用于动态二维数组或修改指针本身。
#include <stdio.h>
int main() {
int a = 5;
int *p = &a;
int **pp = &p;
printf("a=%dn", **pp);
return 0;
}
以上用法覆盖了C语言指针的主要场景。多写代码观察地址变化,就能逐渐消除对指针的恐惧。