【c语言指针详解】复杂数据结构的指针用法

这篇具有很好参考价值的文章主要介绍了【c语言指针详解】复杂数据结构的指针用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

目录

一、动态内存分配

1.1 使用malloc和free函数进行内存的动态分配和释放

1.2 内存泄漏和野指针的概念和解决方法

二、复杂数据结构的指针用法

2.1 结构体指针和成员访问操作符

2.2 指针数组和指向指针的指针

2.2.1 指针数组

2.2.2 指向指针的指针

2.3 动态内存分配与结构体指针的结合使用


🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。

🎁欢迎大家给我点赞👍、收藏⭐️,并在留言区📝与我互动,这些都是我前进的动力!

🌟我的格言:森林草木都有自己认为对的角度🌟。

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

一、动态内存分配

1.1 使用malloc和free函数进行内存的动态分配和释放

malloc 函数用于在运行时动态分配内存。它接受一个参数,表示需要分配的内存大小(以字节为单位),并返回一个指向分配内存的指针。如果分配成功,则返回的指针指向一块连续的、未初始化的内存区域;如果分配失败,则返回一个特殊的空指针(NULL)。

free 函数用于释放之前通过 malloc 或者类似函数动态分配的内存。它接受一个参数,表示需要释放的内存区域的起始地址。调用 free 函数将释放指定内存区域,这样释放的内存可以被重新分配给其他部分。

示例代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int* ptr;

    // 动态分配内存
    ptr = (int*)malloc(5 * sizeof(int));
    if (ptr == NULL) {
        printf("内存分配失败\n");
        exit(1); // 终止程序
    }

    // 使用分配的内存
    for (int i = 0; i < 5; i++) {
        ptr[i] = i + 1;
    }

    // 打印数组的值
    for (int i = 0; i < 5; i++) {
        printf("%d ", ptr[i]);
    }
    printf("\n");

    // 释放内存
    free(ptr);

    return 0;
}

输出结果如下:

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

上面的代码首先使用 malloc 函数动态分配了一个数组,然后使用循环给数组赋值。最后打印数组的值,并使用 free 函数释放了之前分配的内存空间。

1.2 内存泄漏和野指针的概念和解决方法

内存泄漏指的是分配的内存空间在不再使用时没有被释放,导致该内存无法被重新分配使用,并且随着程序运行时间的增长,已分配但未释放的内存会不断增加,最终导致程序崩溃。

可以使用 malloc 和 free 函数进行内存管理,为避免内存泄漏,释放内存的方法是在不再需要内存时调用 free 函数将其释放。

野指针则是指指向已释放或未分配内存空间的指针。

野指针的出现通常是由于对已释放的内存空间进行操作,或者未初始化指针的值导致指针指向未知的内存空间。使用野指针可能导致程序崩溃或者产生不可预测的结果。为避免野指针,应该在使用指针之前对其进行初始化,并在释放内存之后将指针置为 NULL

示例代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    // 内存泄漏
    int* ptr = (int*)malloc(sizeof(int));
    if (ptr != NULL) {
        *ptr = 10;
    }
    // 需要释放内存
    free(ptr);

    // 野指针
    int* ptr2 = NULL;
    ptr2 = (int*) malloc( sizeof(int) );
    if ( ptr2 != NULL ) {
        *ptr2 = 20;
        // 在释放完内存后,应该将指针赋值为 NULL,避免出现野指针问题
        free(ptr2);
        ptr2 = NULL;
    }

    return 0;
}

二、复杂数据结构的指针用法

2.1 结构体指针和成员访问操作符

在 C 语言中,结构体是一种自定义数据类型,可以将不同类型的数据组合在一起,形成一个整体的数据类型。

结构体指针可以指向结构体变量,也可以指向动态分配的结构体内存空间,使用结构体指针可以方便地对结构体成员进行操作。

成员访问操作符有两种,一种是点操作符号 .,另一种是箭头操作符号 -> 。点操作符号用于访问结构体变量的成员,箭头操作符号则用于访问结构体指针指向的结构体变量的成员。

示例代码:

#include <stdio.h>
#include <string.h>

// 定义一个结构体类型
struct Student {
    char name[20];
    int age;
    float score;
};

int main() {
    // 定义一个结构体变量
    struct Student stu1 = {"Tom", 18, 90.5};
    // 定义一个结构体指针,指向结构体变量
    struct Student *p = &stu1;

    // 使用成员访问操作符号点操作符访问结构体变量的成员
    printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);

    // 使用成员访问操作符号箭头操作符访问结构体指针指向的结构体变量的成员
    printf("%s %d %.2f\n", p->name, p->age, p->score);

    // 修改结构体指针指向的结构体变量的成员
    strcpy(p->name, "Jim");
    p->age = 19;
    p->score = 88.5;

    // 使用成员访问操作符号点操作符访问结构体变量的成员
    printf("%s %d %.2f\n", stu1.name, stu1.age, stu1.score);

    // 使用成员访问操作符号箭头操作符访问结构体指针指向的结构体变量的成员
    printf("%s %d %.2f\n", p->name, p->age, p->score);

    return 0;
}

输出结果如下:

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

在上面的代码中,我们首先定义了一个结构体类型 Student,然后定义了一个 Student 类型的结构体变量 stu1 和一个指向 stu1 的结构体指针 p。接着,我们使用点操作符号和箭头操作符号分别访问了结构体变量和结构体指针指向的结构体变量的成员,并修改了结构体指针指向的结构体变量的成员。

2.2 指针数组和指向指针的指针

2.2.1 指针数组

指针数组是一个数组,其元素都是指针类型。每个指针指向一个特定类型的对象或单元。可以通过索引来访问数组中的每个指针,并使用指针进一步操作对应的对象或单元。

示例代码:

#include <stdio.h>

int main() {
    int num1 = 10, num2 = 20, num3 = 30;
    int* ptrArr[3];  // 声明一个指针数组

    ptrArr[0] = &num1;  // 指针数组的第一个元素指向 num1
    ptrArr[1] = &num2;  // 指针数组的第二个元素指向 num2
    ptrArr[2] = &num3;  // 指针数组的第三个元素指向 num3

    for (int i = 0; i < 3; i++) {
        printf("Element %d: %d\n", i, *(ptrArr[i]));
    }

    return 0;
}

输出结果如下:

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

在上述示例中,我们定义了一个指针数组 ptrArr,它有 3 个元素,每个元素都是 int 类型的指针。我们将 num1num2 和 num3 的地址依次赋给指针数组的元素,然后通过指针数组访问并打印对应的值。

2.2.2 指向指针的指针

指向指针的指针是一个指针,它存储了指针的地址。通过指向指针的指针可以间接地访问并修改指针所指向的变量。

示例代码:

#include <stdio.h>

int main() {
    int num = 10;
    int* ptr = &num;
    int** ptrPtr = &ptr;  // 声明一个指向指针的指针

    printf("Value of num: %d\n", num);
    printf("Value of *ptr: %d\n", *ptr);
    printf("Value of **ptrPtr: %d\n", **ptrPtr);

    return 0;
}

输出结果如下:

【c语言指针详解】复杂数据结构的指针用法,c语言,c语言,开发语言,c++,算法,数据结构,青少年编程,笔记

在上述示例中,我们定义了一个指针 ptr,它存储了 num 的地址。然后,我们定义了一个指向指针的指针 ptrPtr,它存储了 ptr 的地址。通过 **ptrPtr,我们可以间接地访问并输出 num 的值。

2.3 动态内存分配与结构体指针的结合使用

可以使用动态内存分配和结构体指针的结合使用,来动态创建和操作结构体对象。这种组合可以在运行时动态地分配内存空间以存储结构体对象,并使用结构体指针来访问和操作这些对象。

示例代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int id;
    char name[20];
} Student;

int main() {
    int numStudents;
    printf("Enter the number of students: ");
    scanf("%d", &numStudents);

    // 动态分配内存以存储指定数量的结构体对象
    Student* students = (Student*)malloc(numStudents * sizeof(Student));

    // 输入每个学生的信息
    for (int i = 0; i < numStudents; i++) {
        printf("Enter information for student %d:\n", i + 1);

        printf("ID: ");
        scanf("%d", &(students[i].id));

        printf("Name: ");
        scanf("%s", students[i].name);
    }

    // 输出每个学生的信息
    printf("\nStudent Information:\n");
    for (int i = 0; i < numStudents; i++) {
        printf("ID: %d, Name: %s\n", students[i].id, students[i].name);
    }

    // 释放动态分配的内存
    free(students);

    return 0;
}

在上述示例中,我们首先通过 malloc 函数动态分配了足够的内存空间来存储指定数量的 Student 结构体对象。然后,我们使用结构体指针 students 来访问和操作每个结构体对象的成员。通过输入每个学生的信息并输出学生信息,展示了动态分配内存和结构体指针的结合使用的一个简单例子。文章来源地址https://www.toymoban.com/news/detail-765255.html

到了这里,关于【c语言指针详解】复杂数据结构的指针用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c语言版:数据结构(时间复杂度,空间复杂度,练习)

        时间复杂度是用来衡量算法执行时间的一个指标。它表示随着输入规模的增加,算法执行时间的增长率。时间复杂度通常用大O符号表示。    在计算时间复杂度时,通常会 忽略常数项、低阶项和系数项 , 只关注随着输入规模增长而导致的主要影响。这是因为在实际应用

    2024年01月21日
    浏览(37)
  • 数据结构 | 算法的时间复杂度和空间复杂度【详解】

    数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系的数据元素的集合。 算法(Algorithm):就是定义良好的计算过程,他取一个或一组的值为输入,并产生出一个或一组值作为输出。简单来说算法就是一系列的计算步骤,用来将输入数据转

    2024年02月08日
    浏览(35)
  • [数据结构-C语言] 算法的时间复杂度

    目录 1.算法的复杂度 2.时间复杂度 2.1 时间复杂度的概念 2.2 大O的渐进表示法 3、常见时间复杂度计算举例 3.1 冒泡排序 3.2 二分查找 3.3 阶乘递归 3.4 斐波那契数列 1.算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此 衡量一个算法的

    2024年02月02日
    浏览(32)
  • 数据结构_复杂度讲解(附带例题详解)

    数据结构是计算机科学中研究数据组织、存储、管理和操作的方法和原则。它涉及到各种不同的数据类型和数据组织方式,包括数组、链表、树、图等。数据结构的设计和实现可以影响到程序的效率和可靠性,因此是计算机科学中非常重要的一个领域。 (数据结构是计算机存

    2024年02月07日
    浏览(36)
  • C语言数据结构(1)复杂度(大o阶)

    欢迎来到博主的专栏——C语言与数据结构 博主ID——代码小豪 实现相同作用的不同代码,如何分辨这些代码的优劣之处呢? 有人说了,我写的代码10行,别人写的是20行,我的代码更加简洁。那就是好代码 在可读性方面可能会更优(简洁≠可读性高),但是一个软件的使用

    2024年01月19日
    浏览(22)
  • 初阶数据结构之---导论,算法时间复杂度和空间复杂度(C语言)

    数据结构其实也学了挺长时间了,说着是要刷题所以才没怎么去写关于数据结构方面的内容。数据结构作为计算机中及其重要的一环,如果不趁着假期系统整理一下着实可惜,我这里构想的是将初阶数据结构和高阶数据结构,分别分成两个部分,初阶数据结构呢,大概有以下

    2024年02月22日
    浏览(39)
  • C语言自定义数据类型(三)结构体指针

    所谓结构体指针就是指向结构体变量的指针,一个结构体变量的起始地址就是这个结构体变量的指针。如果把一个结构体变量的起始地址存放在一个指针变量中,那么,这个指针变量就指向该结构体变量。 目录 一、指向结构体变量的指针 1.1举例说明 二、指向结构体数组的指

    2024年02月06日
    浏览(34)
  • 【数据结构】排序算法复杂度 及 稳定性分析 【图文详解】

    前面给大家讲述了各大排序算法的原理、思路以及实现步骤、代码码源,下面让我们来对比一下各大排序之间的算法复杂度以及稳定性分析优劣,加深我们对于各排序算法的理解,帮助我们以后能更快的在具体场景下选择出最适的排序算法。 【数据结构】冒泡排序 (码源实

    2024年02月05日
    浏览(39)
  • 数据结构与算法(Java版) | 详解算法的时间复杂度

    下面我们用一个问题来引出算法的时间复杂度这一概念。 该问题是,怎么去衡量一个程序(或者算法)的执行时间呢?就拿我们刚刚讲的排序算法来说,排序算法这么多,你又如何知晓哪一个排序算法执行的时间谁长谁短呢? 要想搞清楚该问题,那我们就不得不知道度量一

    2024年02月05日
    浏览(37)
  • C语言如何使用枚举类型和位运算来处理复杂的数据结构?

    首先,让我们谈谈枚举类型。假设你是一名班级的学生,而你的班级有很多人。有时我们希望用数字来代表每个学生的年龄,但是对于阅读代码来说,数字很难理解。这就是枚举类型的用武之地! 我们可以用枚举类型来定义一些有意义的名字,这些名字代表我们想要表示的概

    2024年02月12日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包