簡體   English   中英

我不明白這段代碼中的指針是如何工作的?

[英]I don't understand how pointers work in this code?

我不明白下面這部分代碼。 我的意思是alloc_MY_CAR()返回一些數組以及&如何工作,以便newTab->pFunFree = &free_MY_CAR看到newTab->pDat返回的這個數組?

我不太了解指針。 我只知道&存儲變量的地址, *是變量的指針或值。 誰能指導我如何正確使用它以及它是如何工作的? 我是初學者,所以不要對我那么苛刻。

提前致謝!

#pragma once
struct MY_CAR {
    char *model;
    int year;
};


void print_MY_CAR(void* pdata);
void free_MY_CAR(void *pdata);

MY_CAR* alloc_MY_CAR();



    switch (typ) {
        case 0:
            newTab->pDat = alloc_MY_CAR();
            newTab->pFunFree = &free_MY_CAR;
            newTab->pFunPrint = &print_MY_CAR;
            break;
    }
    MY_CAR* alloc_MY_CAR() {
        MY_CAR* tab = (MY_CAR*)calloc(1, sizeof(MY_CAR));
        if (!tab) {
            exit(0);
        }
        else {
            char model[125];
            printf("Podaj model: ");
            scanf("%s", model);
            tab->model = (char*)calloc(strlen(model) + 1, sizeof(char));
            strcpy(tab->model, model);
            printf("Podaj rok: ");
            scanf_s("%d", &tab->year);
        }
        return tab;
    }
void free_MY_CAR(void *pdata) {
    MY_CAR* car = (MY_CAR*)pdata;
    if (!car || !car->model) return ;
    free(car->model);
    free(car);
}

請注意,函數free_MY_CAR有一個void*類型的參數,一個指向“void”類型的指針(這是一個指向某事物的 C 習語,但不告訴所指向事物的類型),它所做的第一件事是將該指針重新解釋為指向MY_CAR的指針。

所以該函數可能打算這樣調用:

newTab->pFunFree(newTab->pDat);

也就是說,函數“知道”什么指針由alloc_MY_CAR()返回並存儲在newTab->pDat是程序員明確地告訴函數什么指針存儲在newTab->pDat

做這樣的事情的好處是它允許一些代碼對數據結構做一些操作,而不必知道程序實際運行時它實際操作的數據結構類型。 在上面對pFunFree的調用中, newTab可能已由問題中顯示的case 0代碼初始化,但可能還有另一種情況使用alloc_MY_JOB()&free_MY_JOB&print_MY_JOB ,其中MY_JOB函數分配/釋放/打印一種&free_MY_CAR alloc_MY_CAR()&free_MY_CAR&print_MY_CAR使用的數據結構完全不同的數據結構。 那么如果你打電話

newTab->pFunPrint(newTab->pDat);

當我們編寫代碼時,我們可能無法預測它是否會打印由alloc_MY_CAR()alloc_MY_JOB()創建的數據結構的內容; 但我們可以預測它會打印關於你的汽車、你的工作或從數據文件中讀取並存儲在newTab任何內容的詳細信息。

我們可以進行函數調用,以適合該數據結構的方式使用該數據結構,而無需知道何時編寫代碼的數據結構類型,這種特性稱為多態性

這是一個繁瑣的習語,有很多方法可以弄錯。 C++ 的賣點之一是使人們能夠比這更容易地編寫多態對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM