Skip to main content
LibreTexts - Ukrayinska

10.2: Покажчики та структури

  • Page ID
    29637
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)

    Як правило, не є гарною практикою надсилати цілі структури до функцій як аргументи. Причина в тому, що ви закінчуєте копіювати багато даних. Транзисторна структура вище містить три подвійні s на 8 байт кожен, короткий Int в 2 байт, і 20 байт для масиву char, залишаючи в цілому 46 байт пам'яті, які потрібно скопіювати, якщо ми передамо це в функцію. Було б набагато ефективніше, якби ми просто передали початкову адресу структури функції. Тобто ми розповідаємо функції, де знайти структуру за допомогою покажчика (це називається «перехід по посиланню» проти більш звичного «проходження по значенню»). Ось чому ми оголосили ptsistor. Ми ініціалізуємо його так:

    ptransistor = &my_transistor;
    

    Щоб отримати доступ до різних полів, ми більше не можемо використовувати період, тому що у нас більше немає транзистора структури; у нас є покажчик на один. Для покажчиків ми отримуємо доступ до полів за допомогою маркера покажчика, який складається з тире, за яким слідує знак більше: -> Таким чином, ми можемо сказати:

    ptransistor->currentgain = 200.0;
    strcpy( ptransistor->model, “2N3904” );
    

    Нижче наведена функція, яка просто виводить значення різних полів.

    void print_transistor( struct transistor *pt )
    {
        printf(“For model: %s\n”, pt->model );
        printf(“Current gain is %lf\n”, pt->currentgain );
        printf(“Breakdown voltage is %lf\n”, pt->breakdown );
        printf(“Maximum power is %lf\n”, pt->maxpower );
    }
    /* note use of %s for string and %lf for “long float” i.e., double */
    

    Передаємо функцію покажчик на транзисторну структуру так:

    print_transistor( &my_transistor );
    
    /* we could also use print_transistor( ptransistor );
       if we initialized it as above */