百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

C语言实战之多级指针

haoteby 2025-02-27 15:16 15 浏览

多级指针(如二级指针 int **、三级指针 int *** 等)在C语言中有一些特定的使用场景,尤其是在需要动态管理复杂数据结构或传递指针的指针时。以下是多级指针的常见使用场景及示例代码:


1. 动态分配二维数组

多级指针常用于动态分配二维数组。通过二级指针可以灵活管理行和列的内存。

示例代码:

#include 
#include 

int main() {
    int rows = 3, cols = 4;
    int **arr;

    // 分配行指针
    arr = (int **)malloc(rows * sizeof(int *));
    if (arr == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 为每一行分配列
    for (int i = 0; i < rows; i++) {
        arr[i] = (int *)malloc(cols * sizeof(int));
        if (arr[i] == NULL) {
            printf("Memory allocation failed!\n");
            return 1;
        }
    }

    // 初始化并打印二维数组
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            arr[i][j] = i * cols + j;
            printf("%d ", arr[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);

    return 0;
}

输出:

0 1 2 3 
4 5 6 7 
8 9 10 11 

2. 修改指针的值

多级指针可以用于修改指针的值。例如,通过二级指针修改一级指针的指向。

示例代码:

#include 
#include 

void allocateMemory(int **ptr) {
    *ptr = (int *)malloc(sizeof(int));
    if (*ptr == NULL) {
        printf("Memory allocation failed!\n");
        exit(1);
    }
    **ptr = 100; // 修改指针指向的值
}

int main() {
    int *p = NULL;
    allocateMemory(&p); // 传递指针的地址
    printf("Value: %d\n", *p);

    free(p);
    return 0;
}

输出:

Value: 100

3. 动态字符串数组

多级指针可以用于管理动态字符串数组(如 char **),常用于存储多个字符串。

示例代码:

#include 
#include 
#include 

int main() {
    int n = 3;
    char **strings = (char **)malloc(n * sizeof(char *));
    if (strings == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 分配并初始化字符串
    strings[0] = strdup("Hello");
    strings[1] = strdup("World");
    strings[2] = strdup("C Programming");

    // 打印字符串
    for (int i = 0; i < n; i++) {
        printf("%s\n", strings[i]);
    }

    // 释放内存
    for (int i = 0; i < n; i++) {
        free(strings[i]);
    }
    free(strings);

    return 0;
}

输出:

Hello
World
C Programming

4. 函数返回动态分配的指针

多级指针可以用于函数返回动态分配的指针,避免返回局部变量的地址。

示例代码:

#include 
#include 

int **createMatrix(int rows, int cols) {
    int **matrix = (int **)malloc(rows * sizeof(int *));
    if (matrix == NULL) return NULL;

    for (int i = 0; i < rows; i++) {
        matrix[i] = (int *)malloc(cols * sizeof(int));
        if (matrix[i] == NULL) return NULL;
    }

    return matrix;
}

int main() {
    int rows = 2, cols = 3;
    int **matrix = createMatrix(rows, cols);

    if (matrix == NULL) {
        printf("Memory allocation failed!\n");
        return 1;
    }

    // 初始化并打印矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            matrix[i][j] = i * cols + j;
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);

    return 0;
}

输出:

0 1 2 
3 4 5 

5. 多级指针与链表/树结构

多级指针可以用于操作复杂的数据结构,如链表、树等。例如,在链表中插入节点时,可能需要修改头指针的指向。

示例代码(链表插入):

#include 
#include 

struct Node {
    int data;
    struct Node *next;
};

void insertNode(struct Node **head, int value) {
    struct Node *newNode = (struct Node *)malloc(sizeof(struct Node));
    newNode->data = value;
    newNode->next = *head;
    *head = newNode;
}

void printList(struct Node *head) {
    while (head != NULL) {
        printf("%d -> ", head->data);
        head = head->next;
    }
    printf("NULL\n");
}

int main() {
    struct Node *head = NULL;

    insertNode(&head, 10);
    insertNode(&head, 20);
    insertNode(&head, 30);

    printList(head);

    // 释放链表内存
    struct Node *temp;
    while (head != NULL) {
        temp = head;
        head = head->next;
        free(temp);
    }

    return 0;
}

输出:

30 -> 20 -> 10 -> NULL

总结

多级指针的使用场景包括:

  1. 动态分配多维数组(如二维数组)。
  2. 修改指针的值(通过传递指针的指针)。
  3. 管理动态字符串数组。
  4. 函数返回动态分配的指针。
  5. 操作复杂数据结构(如链表、树)。

多级指针虽然强大,但也容易引发内存管理问题(如内存泄漏、悬空指针),因此在使用时需要格外小心。

相关推荐

全球仅 1 辆!粉橙“郁金香”GT4 RS炸街,赞德沃特周末围观指南

“各位直男同胞,如果你女友突然送你一束‘郁金香’,别急着感动——万一钥匙在手,0-100km/h3.4秒,你会先感动还是先腿软?”...

国际足坛那些与国旗无关的国家队球衣

在世界足坛,国家队的球衣颜色一般都与国旗的颜色有关,不过也有例外。都知道意大利球衣由绿白红三色组成,但意大利球衣却是蓝色的,这是为什么呢?事实上意大利从1922年起就穿蓝色球衣,而那是当时意大利王室的...

世界主权国家国旗一览(欧洲篇)_世界国家的旗帜

1、芬兰(芬兰共和国)2、瑞典(瑞典王国)3、挪威(挪威王国)4、冰岛(冰岛共和国...

“黑色”机场:17国国旗全降半旗,荷兰王室和政府成员沉默以待

8年前,也就是2014年的7月23日,荷兰国王夫妇一身深沉黑装走在队伍的最前沿,身后跟着的是政府总理以及部分高级官员,没有例外,这些人的着装全都是清一色的黑装。不仅于此,机场上空的17个国家国旗也全部...

LiveScore为范戴克庆生:史上唯一举起英超奖杯的荷兰队长

今天是利物浦队长范戴克的34岁生日,媒体LiveScore晒出海报为范戴克庆生。海报中,范戴克身披荷兰国旗,手举英超奖杯。LiveScore写道:“祝范戴克生日快乐!史上唯一举起英超奖杯的荷兰队长!...

为何很多国家都用三色条纹国旗?_为什么很多国家国旗是三道杠

为何很多国家都用三色条纹国旗?你有没有发现,很多国家的国旗都是三种颜色的条纹旗,荷兰、俄罗斯、法国的国旗甚至连颜色都一样,实在是很难区分。据统计,世界上近1/3的国家都用的是三色条纹旗:俄罗斯是横着的...

西欧12个国家国旗的设计者和由来_西欧12个国家国旗的设计者和由来简介

1、法国国旗的设计者:答:雅克·路易·大卫:出生于法国巴黎,法国新古典主义画派画家,毕业于法国皇家绘画雕塑院。1794年设计的三色旗被正式采用为法国国旗。2、俄罗斯国旗的设计者:答:彼得一世:出生于莫...

世界杯再现橙色风暴,荷兰队为何要穿橙色?原因竟是个谐音梗

在世界杯上的荷兰队,总是给人留下深刻的印象。大开大合的全攻全守踢法,两翼齐飞的性感足球让人过目不忘。作为球迷,首先希望橙色军团荷兰队能在2022年,再次掀起郁金香风暴。荷兰队的橙色球衣给人以青春活力的...

国旗太像了!欧洲人自己也分不清,闹了不少笑话

国旗是一个国家身份的象征。但很多小伙伴都发现了,欧洲很多国家的国旗都十分相似,“傻傻分不清”。...

每日一旗——西欧篇荷兰_荷兰 西欧

从这期文章开始,我将在每一期文章里给大家介绍一面国旗,(希望我能够坚持下去...

剧荒吗?爱奇艺高热度“谍战剧”TOP5,剧粉不容错过!

Win2000服务器配置共享权限的老问题至今还在坑人,运维稍不留神就被各种"访问被拒"搞崩溃。关键得揪住三个死结:SMB协议兼容性、跨系统认证机制、权限继承逻辑,少一个环节全网瘫痪。W...

紧急 全球爆发比特币勒索病毒攻击,紧急应对措施!

北京时间2017年5月12日20时左右,全球爆发大规模勒索软件感染事件,我国大量行业企业内网、阿里云等大规模感染,教育网受损严重,攻击造成了教学系统瘫痪,甚至包括校园一卡通系统。判定该勒索软件是...

曾利用驱动人生升级通道传播的木马下载器攻击方法再次升级

一、概述御见威胁情报中心1月25日再次监测到曾利用驱动人生升级通道传播的木马下载器攻击方法再升级。本次升级主要变化在于攻击模块,木马在之前的版本上,新增计划任务“DnsScan”,在其中将永恒之蓝攻击...

【建议收藏】292个聚丙烯牌号性能、用途汇总!

聚丙烯(PP)作为五大通用塑料之一,其产量占据着世界第二把交椅,国内产量也是不可小觑。...

系统小技巧:改变Windows 10默认登录验证方式

在早期的WindowsXP或Vista系统中,密码凭据是登录系统的唯一选项。Windows10则大大不同,它在登录时能够提供包括本地账户密码、网络账户密码、Pin码、图形码以及其他各种验证识别方式...