ЖУРНАЛ ХАКЕР

Учим Си: работа с указателями

Xakep, номер #033, стр. 033-052-2


blabla = zluka(3);

}

int zluka (int gygy)

{

return (gygy + 2);

}

Итак, у нас определены две процедуры, главная и побочная. Первое слово в записи передает - какой тип инфы функция возвращает по завершении, если void - значит ничего не возвращает. Затем идет имя function`a, требования такие же, как и к имени переменной. Дальше в скобках перечисляются переменные и типы, которые функция берет от той, что ее вызывает. Называть их можешь, как хочешь, они чисто для внутреннего использования, а вот типы должны совпадать и даже в том же порядке. Не забывай! Если в скобках ничего не стоит, значит функции пофиг на погоду. Так, после объявления этих самых переменных идет открывающая фигурная скобка, в конце функции - закрывающая (никогда не забывай их ставить!), все что между - называют телом программы (ох, люблю тело - свое и женское :). Как видишь, в main у нас идет присвоение всяких там значений переменным. При присвоении всегда помни, что маза слева должна быть того же типа, что маза справа. Символы не забывай брать в амперстанды, цифры можешь писать как есть. В процедуре gygy использована команда return, она, типа, возвращает какую-то инфу той функции, которая ее вызвала, то есть - main. Синтаксис, как стало заметно, простой.

Указатели и стрелочники

Важной фишкой в кодинге на Си являются указатели, некие стрелочники, которые сами ничего юзабельного не содержат, а просто показывают пальцами на другие переменные. Типа есть у нас переменная int kaka, которая содержит цифру, так вот, int *byaka - указатель на какую-то циферку, снежинка говорит о том, что это указатель, byaka не содержит в себе ничего, она указывает на какую-нибудь переменную. Если в теле программы написать byaka = &kaka, то потом использование бяки будет равносильно использованию каки. Знак & перед именем в присвоении значит выдачу адреса переменной в памяти (только не говори, что ты не знал, что у любой переменной или не переменной есть свой адрес :), а указатель по своей ушлой натуре содержит в себе именно адрес. Сей adr и подлежит наводке стрелочников: стрелы переводить надо сюда.

Итак:

void main ()

{

int kaka;

int buka;

int *byaka;

kaka = 5;

byaka = &kaka;

buka = *byaka;

printf("kaka = %d, byaka = %d, buka = %d \n",

kaka, *byaka, buka);

}

Во, какая сложная программулина. В начале объявляются цифры "кака" и "бука", а также указатель на какую-нибудь циферку "бяка". Затем кака становится равной 5, а бяка начинает метать стрелы на каку если чего, буке присваивается значение бяки, то есть каки (ведь бяка ссылается на каку сразу, а чтобы получить значение от указателя - надо поставить перед ним *, иначе это будет просто адрес памяти). Потом всемирно известный оператор printf() выводит все на штуку, называемую нынче монитором. Кстати, об использовании printf():

printf ("%d, %d, %c, какой-то текст\n",

kaka, buka, bukovka);

Оператор занимается выводом текста и переменных на экран, сначала в скобках идет текст, взятый в кавычки. Внутри текста, чтобы заюзать переменную, расставляем где надо специальные мазы - %d, %c, которые говорят о том, что их надо заменить переменными, которые пойдут дальше через запятую (соблюдай порядок, случайных связей берегись!). %d - значит циферка, %c - буковка, %s - слово или фраза, другие тебе пока не нужны. После любой запятой можно сделать перенос на следующую строку, не опасаясь за жизнь бук и бяк. Ах да, \n среди текста - значит перевод строки, \r - перевод каретки, \t - табуляция, \\ - чтобы получить сам символ \. Вообще же, если перед символом стоит \ - значит, символ не простой, а специальный. Есть еще операторы fprintf(), sprintf() - там все аналогично, только вывод идет соответственно в файл или в переменную типа строка, первым параметром в скобках задается имя переменной.

Назад на стр. 033-052-1  Содержание  Вперед на стр. 033-052-3