国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【c語言指針詳解】復雜數據結構的指針用法

這篇具有很好參考價值的文章主要介紹了【c語言指針詳解】復雜數據結構的指針用法。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

【c語言指針詳解】復雜數據結構的指針用法,c語言,c語言,開發(fā)語言,c++,算法,數據結構,青少年編程,筆記

目錄

一、動態(tài)內存分配

1.1?使用malloc和free函數進行內存的動態(tài)分配和釋放

1.2?內存泄漏和野指針的概念和解決方法

二、復雜數據結構的指針用法

2.1?結構體指針和成員訪問操作符

2.2?指針數組和指向指針的指針

2.2.1?指針數組

2.2.2 指向指針的指針

2.3 動態(tài)內存分配與結構體指針的結合使用


??嗨!我是Filotimo__??。很高興與大家相識,希望我的博客能對你有所幫助。

??歡迎大家給我點贊??、收藏??,并在留言區(qū)??與我互動,這些都是我前進的動力!

??我的格言:森林草木都有自己認為對的角度??。

【c語言指針詳解】復雜數據結構的指針用法,c語言,c語言,開發(fā)語言,c++,算法,數據結構,青少年編程,筆記

一、動態(tài)內存分配

1.1?使用malloc和free函數進行內存的動態(tài)分配和釋放

malloc?函數用于在運行時動態(tài)分配內存。它接受一個參數,表示需要分配的內存大?。ㄒ宰止?jié)為單位),并返回一個指向分配內存的指針。如果分配成功,則返回的指針指向一塊連續(xù)的、未初始化的內存區(qū)域;如果分配失敗,則返回一個特殊的空指針(NULL)。

free?函數用于釋放之前通過?malloc?或者類似函數動態(tài)分配的內存。它接受一個參數,表示需要釋放的內存區(qū)域的起始地址。調用?free?函數將釋放指定內存區(qū)域,這樣釋放的內存可以被重新分配給其他部分。

示例代碼:

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

int main() {
    int* ptr;

    // 動態(tài)分配內存
    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語言,開發(fā)語言,c++,算法,數據結構,青少年編程,筆記

上面的代碼首先使用?malloc?函數動態(tài)分配了一個數組,然后使用循環(huán)給數組賦值。最后打印數組的值,并使用?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 語言中,結構體是一種自定義數據類型,可以將不同類型的數據組合在一起,形成一個整體的數據類型。

結構體指針可以指向結構體變量,也可以指向動態(tài)分配的結構體內存空間,使用結構體指針可以方便地對結構體成員進行操作。

成員訪問操作符有兩種,一種是點操作符號?.,另一種是箭頭操作符號?->?。點操作符號用于訪問結構體變量的成員,箭頭操作符號則用于訪問結構體指針指向的結構體變量的成員。

示例代碼:

#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語言,開發(fā)語言,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語言,開發(fā)語言,c++,算法,數據結構,青少年編程,筆記

在上述示例中,我們定義了一個指針數組?ptrArr,它有 3 個元素,每個元素都是?int?類型的指針。我們將?num1、num2?和?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語言,開發(fā)語言,c++,算法,數據結構,青少年編程,筆記

在上述示例中,我們定義了一個指針?ptr,它存儲了?num?的地址。然后,我們定義了一個指向指針的指針?ptrPtr,它存儲了?ptr?的地址。通過?**ptrPtr,我們可以間接地訪問并輸出?num?的值。

2.3 動態(tài)內存分配與結構體指針的結合使用

可以使用動態(tài)內存分配和結構體指針的結合使用,來動態(tài)創(chuàng)建和操作結構體對象。這種組合可以在運行時動態(tài)地分配內存空間以存儲結構體對象,并使用結構體指針來訪問和操作這些對象。

示例代碼:

#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);

    // 動態(tài)分配內存以存儲指定數量的結構體對象
    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);
    }

    // 釋放動態(tài)分配的內存
    free(students);

    return 0;
}

在上述示例中,我們首先通過?malloc?函數動態(tài)分配了足夠的內存空間來存儲指定數量的?Student?結構體對象。然后,我們使用結構體指針?students?來訪問和操作每個結構體對象的成員。通過輸入每個學生的信息并輸出學生信息,展示了動態(tài)分配內存和結構體指針的結合使用的一個簡單例子。文章來源地址http://www.zghlxwxcb.cn/news/detail-765255.html

到了這里,關于【c語言指針詳解】復雜數據結構的指針用法的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • c語言版:數據結構(時間復雜度,空間復雜度,練習)

    c語言版:數據結構(時間復雜度,空間復雜度,練習)

    ? ? 時間復雜度是用來衡量算法執(zhí)行時間的一個指標。它表示隨著輸入規(guī)模的增加,算法執(zhí)行時間的增長率。時間復雜度通常用大O符號表示。 ? ?在計算時間復雜度時,通常會 忽略常數項、低階項和系數項 , 只關注隨著輸入規(guī)模增長而導致的主要影響。這是因為在實際應用

    2024年01月21日
    瀏覽(25)
  • 數據結構 | 算法的時間復雜度和空間復雜度【詳解】

    數據結構 | 算法的時間復雜度和空間復雜度【詳解】

    數據結構(Data Structure)是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關系的數據元素的集合。 算法(Algorithm):就是定義良好的計算過程,他取一個或一組的值為輸入,并產生出一個或一組值作為輸出。簡單來說算法就是一系列的計算步驟,用來將輸入數據轉

    2024年02月08日
    瀏覽(31)
  • [數據結構-C語言] 算法的時間復雜度

    [數據結構-C語言] 算法的時間復雜度

    目錄 1.算法的復雜度 2.時間復雜度 2.1 時間復雜度的概念 2.2 大O的漸進表示法 3、常見時間復雜度計算舉例 3.1 冒泡排序 3.2 二分查找 3.3 階乘遞歸 3.4 斐波那契數列 1.算法的復雜度 算法在編寫成可執(zhí)行程序后,運行時需要耗費時間資源和空間(內存)資源 。因此 衡量一個算法的

    2024年02月02日
    瀏覽(17)
  • 數據結構_復雜度講解(附帶例題詳解)

    數據結構_復雜度講解(附帶例題詳解)

    數據結構是計算機科學中研究數據組織、存儲、管理和操作的方法和原則。它涉及到各種不同的數據類型和數據組織方式,包括數組、鏈表、樹、圖等。數據結構的設計和實現可以影響到程序的效率和可靠性,因此是計算機科學中非常重要的一個領域。 (數據結構是計算機存

    2024年02月07日
    瀏覽(25)
  • C語言數據結構(1)復雜度(大o階)

    C語言數據結構(1)復雜度(大o階)

    歡迎來到博主的專欄——C語言與數據結構 博主ID——代碼小豪 實現相同作用的不同代碼,如何分辨這些代碼的優(yōu)劣之處呢? 有人說了,我寫的代碼10行,別人寫的是20行,我的代碼更加簡潔。那就是好代碼 在可讀性方面可能會更優(yōu)(簡潔≠可讀性高),但是一個軟件的使用

    2024年01月19日
    瀏覽(24)
  • 初階數據結構之---導論,算法時間復雜度和空間復雜度(C語言)

    初階數據結構之---導論,算法時間復雜度和空間復雜度(C語言)

    數據結構其實也學了挺長時間了,說著是要刷題所以才沒怎么去寫關于數據結構方面的內容。數據結構作為計算機中及其重要的一環(huán),如果不趁著假期系統(tǒng)整理一下著實可惜,我這里構想的是將初階數據結構和高階數據結構,分別分成兩個部分,初階數據結構呢,大概有以下

    2024年02月22日
    瀏覽(29)
  • C語言自定義數據類型(三)結構體指針

    C語言自定義數據類型(三)結構體指針

    所謂結構體指針就是指向結構體變量的指針,一個結構體變量的起始地址就是這個結構體變量的指針。如果把一個結構體變量的起始地址存放在一個指針變量中,那么,這個指針變量就指向該結構體變量。 目錄 一、指向結構體變量的指針 1.1舉例說明 二、指向結構體數組的指

    2024年02月06日
    瀏覽(18)
  • 數據結構與算法(Java版) | 詳解算法的時間復雜度

    數據結構與算法(Java版) | 詳解算法的時間復雜度

    下面我們用一個問題來引出算法的時間復雜度這一概念。 該問題是,怎么去衡量一個程序(或者算法)的執(zhí)行時間呢?就拿我們剛剛講的排序算法來說,排序算法這么多,你又如何知曉哪一個排序算法執(zhí)行的時間誰長誰短呢? 要想搞清楚該問題,那我們就不得不知道度量一

    2024年02月05日
    瀏覽(25)
  • 【數據結構】排序算法復雜度 及 穩(wěn)定性分析 【圖文詳解】

    【數據結構】排序算法復雜度 及 穩(wěn)定性分析 【圖文詳解】

    前面給大家講述了各大排序算法的原理、思路以及實現步驟、代碼碼源,下面讓我們來對比一下各大排序之間的算法復雜度以及穩(wěn)定性分析優(yōu)劣,加深我們對于各排序算法的理解,幫助我們以后能更快的在具體場景下選擇出最適的排序算法。 【數據結構】冒泡排序 (碼源實

    2024年02月05日
    瀏覽(121)
  • C語言如何使用枚舉類型和位運算來處理復雜的數據結構?

    首先,讓我們談談枚舉類型。假設你是一名班級的學生,而你的班級有很多人。有時我們希望用數字來代表每個學生的年齡,但是對于閱讀代碼來說,數字很難理解。這就是枚舉類型的用武之地! 我們可以用枚舉類型來定義一些有意義的名字,這些名字代表我們想要表示的概

    2024年02月12日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包