C语言指针
1. 指针的基本概念
1.1 什么是指针?
指针是一个变量,存储的是另一个变量的内存地址。
指针的类型决定了它所指向的数据类型(如 int * 指向整数,char * 指向字符)。
1.2 指针的声明
语法:数据类型 *指针变量名;
示例:
int *p; // 声明一个指向整数的指针
char *c; // 声明一个指向字符的指针
1.3 取地址运算符 &
& 用于获取变量的内存地址。
示例:
int a = 10;
int *p = &a; // p 存储变量 a 的地址
1.4 解引用运算符*
*用于访问指针所指向的内存地址中的值。
示例:
int a = 10;
int *p = &a;
printf("%d", *p); // 输出 10
2. 指针的常见用法
2.1 指针与数组
数组名是一个指向数组首元素的常量指针。
示例:
int arr[3] = {1, 2, 3};
int *p = arr; // p 指向数组的第一个元素
printf("%d", *(p + 1)); // 输出 2
2.2 指针与函数
指针可以作为函数参数,实现传址调用。
示例:
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
int x = 10, y = 20;
swap(&x, &y); // 交换 x 和 y 的值
2.3 指针与动态内存分配
使用 malloc、calloc、realloc 动态分配内存,返回指向分配内存的指针。
示例:
int *arr = (int *)malloc(10 * sizeof(int)); // 分配10个整数的内存
free(arr); // 释放内存
2.4 指针与字符串
字符串通常用字符指针表示。
示例:
char *str = "Hello";
printf("%s", str); // 输出 Hello
2.5 指针与结构体
指针可以指向结构体,访问结构体成员。
示例:
struct Point { int x; int y; };
struct Point p1 = {10, 20};
struct Point *p = &p1;
printf("%d", p->x); // 输出 10
3. 指针的高级用法
3.1 指针数组
指针数组是一个数组,其元素是指针。
示例:
int a = 1, b = 2, c = 3;
int *arr[3] = {&a, &b, &c}; // 指针数组
printf("%d", *arr[1]); // 输出 2
3.2 数组指针
数组指针是一个指针,指向一个数组。
示例:
int arr[3] = {1, 2, 3};
int (*p)[3] = &arr; // 数组指针
printf("%d", (*p)[1]); // 输出 2
3.3 函数指针
函数指针是一个指针,指向一个函数。
示例:
int add(int a, int b) { return a + b; }
int (*p)(int, int) = add; // 函数指针
printf("%d", p(2, 3)); // 输出 5
3.4 多级指针
多级指针是指针的指针,用于间接访问数据。
示例:
int a = 10;
int *p = &a;
int **pp = &p; // 二级指针
printf("%d", **pp); // 输出 10
4. 指针的注意事项
4.1 空指针(NULL Pointer)
空指针是一个不指向任何有效内存地址的指针,通常用 NULL 表示。
示例:
int *p = NULL;
if (p == NULL) {
printf("指针为空");
}
4.2 野指针(Dangling Pointer)
野指针是指向已释放内存的指针,访问野指针会导致未定义行为。
示例:
int *p = (int *)malloc(sizeof(int));
free(p); // 释放内存
*p = 10; // 错误:p 是野指针
4.3 指针的类型转换
指针类型转换需要谨慎,错误的类型转换可能导致数据错误。
示例:
int a = 10;
char *p = (char *)&a; // 将 int 指针转换为 char 指针
4.4 指针的算术运算
指针的算术运算基于指针的类型大小。
示例:
int arr[3] = {1, 2, 3};
int *p = arr;
p++; // p 指向 arr[1]
5. 总结
指针是C语言的核心特性,提供了对内存的直接操作。
指针的常见用法包括数组、函数、动态内存分配、字符串和结构体。
指针的高级用法包括指针数组、数组指针、函数指针和多级指针。
使用指针时需要注意空指针、野指针和类型转换等问题。

浙公网安备 33010602011771号