Программирование на языке си ( с ) | C Sharp (Си шарп) с нуля. Сортировки | Массивы | Функции

Указатели в языке си ( c )

   Указатели

Давайте для начала разберем, что такое указатели в языке си. Далее вы поймете, почему эту тему я начал именно с них. И так указатель в си - это переменная, которая содержит адрес в памяти. В предвидущем уроке я опустил объяснение момента о передаче не копии нашей переменной в функцию, а самой переменной. Так вот, для передачи самого объекта нужно передать его адрес. Но давайте, сперва, рассмотрим объявление указателя:

int *ptr;
char *ch;
float *fl;

Так как указатели содержат адреса объектов (переменных), то, соответственно, значения там хранятся одного типа и любой указатель занимает в памяти 2 байта. Выше вы увидели объявление указателей, но мы им не присвоили адресов переменных. Т.е. пока каждый из наших указателей имеет значение NULL. Давайте все-таки присвоим указателю адрес переменной:

int c = 10;
int *ptr = &c;

Т.е. мы объявили сначала переменную с, далее сразу при объявлении указателя, инициализировали его адресом переменной с. Знак перед переменной с (&), называется операцией взятия адреса, которая возвращает адрес переменной.

Теперь давайте посмотрим, как же можно было передать в функцию не копии, а именно сами объекты:

#include <conio.h>
#include <stdio.h>

void swap (int *x, int *y){
     int z = *x;
     *x = *y;
     *y = z;
}

int main()
{
    int c = 10, b = 15;
    swap(&c, &b);
    printf ("%d %d", c ,b );
    getch();
return 0;
}

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

Так же есть еще одна тонкость. Мы в самой функции swap работаем с указателями, но почему-то все время пишем знак указателя (*), хотя мы ж и так передали указатель. Дело тут в том, что повторное написание знака (*), уже будет являться операцией разыменования, т.е. взятия значения с адреса.

Не думайте, что так теперь всегда придется писать функции, когда нам нужно будет изменять значения переменных в функции. В С/С++ есть мощный механизм, который называется ссылкой. Подробнее о ней, и о ее использовании, можете прочесть в статье: различие указателей и ссылок в языке си. А пока ловите эту же функцию, но только с использованием ссылок:

void swap (int &x, int &y){
   int z = x;
   x = y;
   y = z;
}

Тут все гораздо проще, так, что обязательно прочтите статью про ссылки и указатели

Задания:

  1. от вас требуется создать функцию для ввода с клавиатуры числа, и если это число отрицательное, то принудительно приравнивать его к нулю. Функция должна возвращать, полученное значение. Попробуйте выполнить это задание с помощью указателей, а затем с помощью ссылок

Предвидущие уроки:

  1. Основные понятия функции
  2. Пользовательские функции и рекурсия
При копировании ( использовании ) материала размещайте ссылку на сайт www.mir-koda.ru