指针的使用与高级技巧
5.1 指针的基本概念
5.1.1 指针的定义与初始化
指针是存储内存地址的变量。每个指针都指向一个特定的数据类型。在C语言中,定义指针变量的语法如下:
c
type *pointer_name;
- type:指针所指向的数据类型。
- pointer_name:指针变量的名称。
例如,定义一个指向整数的指针:
c
int *ptr;
可以通过&
运算符获取变量的地址,并将其赋给指针:
c
int num = 10;
int *ptr = # // 指针ptr指向num的地址
5.1.2 指针的解引用
通过指针访问指针所指向的变量的值,称为解引用。使用*
运算符来解引用指针:
c
int num = 10;
int *ptr = #
printf("%d\n", *ptr); // 输出:10
5.2 指针的运算
5.2.1 指针的加法与减法
指针可以进行加法和减法运算,这些运算会根据指针所指向的数据类型的大小进行调整。加法操作会使指针移动到下一个元素,减法操作会使指针移动到前一个元素。例如:
c
int arr[3] = {1, 2, 3};
int *ptr = arr;
printf("%d\n", *(ptr + 1)); // 输出:2
printf("%d\n", *(ptr - 1)); // 输出:未定义,超出数组范围
5.2.2 指针的比较
可以比较两个指针是否指向相同的地址,也可以比较指针之间的大小:
c
int arr[3] = {1, 2, 3};
int *ptr1 = &arr[0];
int *ptr2 = &arr[1];
if (ptr1 < ptr2) {
printf("ptr1指向的地址小于ptr2\n");
}
5.3 指针与数组的关系
5.3.1 数组名与指针
在C语言中,数组名可以被视为指向数组第一个元素的指针。例如:
c
int arr[3] = {1, 2, 3};
int *ptr = arr; // 等同于 int *ptr = &arr[0];
5.3.2 使用指针遍历数组
可以使用指针遍历数组中的元素,这种方法在处理动态数组时特别有用。例如:
c
int arr[3] = {1, 2, 3};
int *ptr = arr;
for (int i = 0; i < 3; i++) {
printf("%d\n", *(ptr + i)); // 输出:1 2 3
}
5.4 指向指针的指针
5.4.1 定义与初始化
指向指针的指针(双重指针)是存储指针地址的指针。定义和初始化双重指针如下:
c
int num = 10;
int *ptr = #
int **pptr = &ptr; // pptr是指向ptr的指针
5.4.2 使用双重指针
可以通过双重指针访问和修改指针所指向的值。例如:
c
int num = 10;
int *ptr = #
int **pptr = &ptr;
printf("%d\n", **pptr); // 输出:10
**pptr = 20; // 修改num的值
printf("%d\n", num); // 输出:20
5.5 动态内存分配
5.5.1 使用malloc
函数
malloc
函数用于在堆上动态分配内存。分配的内存块的大小由函数参数指定,函数返回指向分配内存的指针。例如:
c
#include <stdio.h>
#include <stdlib.h>
int main() {
int *ptr = (int *)malloc(sizeof(int) * 5); // 分配5个整数大小的内存
if (ptr == NULL) {
printf("内存分配失败\n");
return 1;
}
for (int i = 0; i < 5; i++) {
ptr[i] = i + 1;
}
for (int i = 0; i < 5; i++) {
printf("%d\n", ptr[i]);
}
free(ptr); // 释放分配的内存
return 0;
}
c
5.5.2 使用calloc
和realloc
函数
-
calloc
:分配内存并初始化为0。c
int *ptr = (int *)calloc(5, sizeof(int)); // 分配5个整数大小的内存,并初始化为0
-
realloc
:调整已分配内存的大小。c
ptr = (int *)realloc(ptr, sizeof(int) * 10); // 扩展内存至10个整数大小
5.6 指针的高级应用
5.6.1 函数指针
函数指针是指向函数的指针,可以用于实现回调机制。例如:
c
#include <stdio.h>
void greet() {
printf("Hello, World!\n");
}
int main() {
void (*func_ptr)() = greet; // 函数指针指向greet函数
func_ptr(); // 调用函数
return 0;
}
c
5.6.2 指针与结构体
指针可以用来操作结构体。可以使用结构体指针访问结构体的成员:
c
#include <stdio.h>
typedef struct {
int age;
char name[50];
} Person;
int main() {
Person p = {25, "Alice"};
Person *ptr = &p;
printf("Name: %s\n", ptr->name); // 使用->访问成员
printf("Age: %d\n", ptr->age);
return 0;
}
c