АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Параметры-указатели

Читайте также:

    Формальный параметр в заголовке функции называют явным параметром- указателем, если перед его именем находится символ *. Например, функция swap1, осуществляющая перестановку местами значений двух переменных, должна получить в качестве параметров адреса этих переменных, т.е. указатели на них:

    void swap1(int *x,int *y) //явные параметры-указатели

    { int tmp=*x;

    *x=*y; *y=tmp;

    }

    Кроме явных параметров-указателей в объявлении функции можно использовать и косвенные параметры-указатели, описанные с помощью механизма подстановок:

    #define pint int*

    ...............

    void swap1(pint x,pint y) //косвенные параметры указатели

    { int tmp=*x;

    *x=*y; *y=tmp;

    }

    Косвенное объявление указателей может использовать и другую синтаксическую конструкцию:

    typedef int* pint;

    Представим себе, что функция swap1 была бы оформлена с параметрами-значениями:

    void swap1(int x,int y)

    { int tmp=x;

    x=y; y=tmp;

    }

    Тогда переставляемые значения поступили бы через стек и попали бы в локальные переменные (формальные параметры) x и y. Перестановка значений в локальных переменных была бы произведена, но вызывающая программа об этом ничего бы не узнала.

    Таким образом, если мы хотим, чтобы результат работы вызываемой функции нашел отражение в передаваемых параметрах, мы должны сообщать не значения параметров, а их адреса. Зная адрес, вызванная функция сама может извлечь нужное значение и, при необходимости, отправить по этому адресу полученный результат.

    Для вызова функции, параметрами которой являются указатели, в качестве фактических аргументов надо задавать адреса переменных, т.е. их имена с предшествующим символом &:

    int x=2,y=3;

    swap1(&x,&y);

    Рассмотрим еще один пример передачи указателя по указателю:

    void swap3(int **v1, int **v2)

    { int *tmp=*v1; *v1=*v2; *v2=tmp; }

    К этой функции можно обратиться следующим образом:

    int i=10, j=20;

    int *pi=&i, *pj=&j;

    swap(&pi,&pj);

    после такого обращения указатели pi и pj "смотрят" на новые значения, т.к. они поменялись адресами (*pi=20, *pj=10), но сами переменные i и j свои значения не поменяли.

    Одним из наиболее распространенных способов использования указателей является передача в качестве адреса имени массива. Например, для суммирования компонент вектора можно воспользоваться следующей функцией:

    int sum_v(int *a,int n)

    { int j,s=0;

    for(j=0; j<n; j++)

    s += a[j];

    return s;

    }

    Обращение к такой функции может выглядеть следующим образом:

    int q[20];

    ..........

    k1=sum_v(q,20); //суммирование всех компонент вектора

    k2=sum_v(q,10); //суммирование первых 10 компонент вектора

    k3=sum_v(&q[5],3); //суммирование q[5]+q[6]+q[7]

    k4=sum_v(q+5,3); //суммирование q[5]+q[6]+q[7]

    Не забывайте, что имя массива одновременно является и указателем на его первый элемент (т.е. q и &q[0] – это одно и то же).

     


    1 | 2 | 3 | 4 | 5 | 6 |

    Поиск по сайту:



    Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.004 сек.)