第5篇:指针的使用与高级技巧

指针的使用与高级技巧

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 = &num;
int **pptr = &ptr;  // pptr是指向ptr的指针

5.4.2 使用双重指针

可以通过双重指针访问和修改指针所指向的值。例如:


c

int num = 10;
int *ptr = &num;
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 使用callocrealloc函数

  • 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值