目录
1. 指针的定义和声明
- 指针是一个变量,用于存储内存地址。
- 声明指针时需要指定指针的数据类型,例如 `int* ptr;` 声明了一个指向 `int` 类型数据的指针。
int* ptr; // 声明一个指向 int 类型数据的指针
float* fptr; // 声明一个指向 float 类型数据的指针
char* cptr; // 声明一个指向 char 类型数据的指针
2. 指针的初始化
- 可以使用取址运算符 `&` 将指针初始化为变量的地址,例如:`int num = 10; int* ptr = #` 这样指针 `ptr` 就指向了变量 `num` 的地址。
int num = 10;
int* ptr = # // 将指针初始化为 num 的地址
float pi = 3.14;
float* fptr = π
char letter = 'A';
char* cptr = &letter;
3. 指针的解引用
- 使用 `*` 运算符可以访问指针指向的值,例如:`printf("%d", *ptr);` 输出指针 `ptr` 所指向的 `int` 类型变量的值。
int num = 10;
int* ptr = #
printf("%d", *ptr); // 输出 num 的值
float pi = 3.14;
float* fptr = π
printf("%f", *fptr); // 输出 pi 的值
char letter = 'A';
char* cptr = &letter;
printf("%c", *cptr); // 输出 letter 的值
4. 空指针和野指针
- 空指针表示指针不指向任何有效的内存地址,可以用 `NULL` 来表示,例如:`int* ptr = NULL;`。
- 野指针表示指针指向未知或已释放的内存地址,使用野指针可能导致程序错误。
int* ptr = NULL; // 声明一个空指针
int* wildPtr; // 未初始化的指针,可能成为野指针
*wildPtr = 5; // 野指针赋值,可能导致错误
5. 动态内存分配与释放
- 使用 `malloc()` 函数可以动态地分配内存空间,返回一个指向新分配内存的指针,例如:`int* ptr = (int*)malloc(sizeof(int));`。
- 使用 `free()` 函数可以释放动态分配的内存,例如:`free(ptr);`。
int* ptr = (int*)malloc(sizeof(int)); // 分配一个 int 类型大小的内存空间
*ptr = 10; // 对分配的内存进行写入操作
free(ptr); // 释放动态分配的内存空间
6. 数组和指针的关系
- 数组名本身就是一个指向数组首元素的指针,例如:`int nums[5] = {1, 2, 3, 4, 5}; int* ptr = nums;`。
- 使用指针可以对数组进行遍历、访问和操作。
int nums[3] = {1, 2, 3};
int* ptr = nums;
printf("%d", *ptr); // 输出第一个元素 1
ptr++; // 将指针移动到下一个元素
printf("%d", *ptr); // 输出第二个元素 2
ptr += 2; // 将指针向后移动两个单位
printf("%d", *ptr); // 输出第三个元素 3
7. 指针与函数
- 可以将指针作为参数传递给函数,用于在函数内部修改实参的值。
- 可以通过函数返回指针来返回动态分配的内存空间。
void changeValue(int* ptr) {
*ptr = 20; // 在函数内部修改指针所指向变量的值
}
int num = 10;
changeValue(&num);
printf("%d", num); // 输出修改后的值 20
8. 多级指针
- 多级指针是指指向指针的指针,可以用于处理二维数组、链表等数据结构。
int num = 10;
int* ptr1 = #
int** ptr2 = &ptr1;
printf("%d", **ptr2); // 输出 num 的值
9. 字符串和指针
- 字符串实际上是以 null 结尾的字符数组,可以使用指针来访问和操作字符串。
char str[] = "Hello";
char* ptr = str;
while (*ptr != '\0') {
printf("%c", *ptr); // 逐个输出字符
ptr++; // 指针移动到下一个字符
}
10. 指针的运算
- 指针可以进行加法和减法运算,用于在内存中移动指针的位置。
- 指针相减可以计算两个指针之间的距离(以元素为单位)。
int nums[3] = {1, 2, 3};
int* ptr = nums;
printf("%d", *ptr); // 输出第一个元素 1
ptr++; // 将指针移动到下一个元素
printf("%d", *ptr); // 输出第二个元素 2
ptr += 2; // 将指针向后移动两个单位
printf("%d", *ptr); // 输出第三个元素 3
int diff = ptr - nums; // 计算两个指针之间的距离
printf("%d", diff); // 输出 2(以元素为单位)