adfun.ru
 
BIGLIB
  большущая библиотека (9812 книг), можно не только прочитать но и скачать бесплатно
 
АСТРОЛОГИЯ
  книги по астрологии
 
КРИМИНАЛ
  книги про криминал
 
ДЕТЕКТИВЫ
  детективы известных
   писателей
 
ФАНТАСТИКА
  фентези, фантастика,   фантастические повести
 
ПРИКЛЮЧЕНИЯ
  книги про приключения,   путешествия
 
ПОЛИТИКА
  книги про политиков,   репрессии
 
ПСИХОЛОГИЯ
  разнообразная литература   по психологии
 
КЛАССИКА
  классическая литература
 
КОМПЬЮТЕРНАЯ
  ЛИТЕРАТУРА
  про компютерное железо,   документация, языки   программирования
 
РЕЛИГИЯ, АТЕИЗМ
  книги про религию
 
ФИЛОСОФИЯ
  книги, которые заставляют   задуматься над   окружающим тебя миром.
 
ЭНЦИКЛОПЕДИИ
  самые интересные   энциклопедии на
   разные темы
 
МЕДИЦИНА
  медицинские книги,   методички,
   народные лечебники
 
КУЛИНАРИЯ
  рецепты тортов,   консервирование,
  все о спиртных
  напитках.
 
СТИХИ
  стихи популярных и не   очень авторов
 
ТВОРЧЕСТВО
  народное творчество,   стихи, песни и т.д.
 
ЮМОР
  анекдоты, приколы,   смешные истории
 
ЛЮБОВНЫЙ РОМАН
  мир высоких чувств и   любовных грез
 
ЭРОТИКА
  эротические рассказы,   книги о технике секса,   кама-сутра и др.




adfun.ru
Rambler's Top100 Rambler's Top100
    НА ГЛАВНУЮ
    РЕФЕРАТЫ
    ТОСТЫ
    ТЕСТЫ
    АВТО
    ДЛЯ СТУДЕНТА
    КНИГИ
    КОНТАКТ
 
Турбо С: руководство пользователя. Часть 1
Автор ""
Размер 993495 Байт
Страница 59 из 69
СКАЧАТЬ КНИГУ ЦЕЛИКОМ

     iptr, но  вместо присваивания числа 421 переменной ivar, это зна-          
     чение присваивается по указателю *iptr.  Каков результат ?  Точно          
     такой же, как и в предыдущей программе. Почему ? Потому что выра-          
     жения *iptr   и  ivar суть одна и та же ячейка памяти - поэтому в          
     этом случае оба оператора заносят значение 421 в  одну  и  ту  же          
     ячейку памяти.                                                             
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                
                                                                                

                         - 485,486 -
                                                                                
                Динамическое распределение                                      
     -----------------------------------------------------------------          
                                                                                
          Изменим еще раз нашу программу:                                       
                                                                                
                  #include                                             
                  main()                                                        
                  {                                                             
                     int *iptr;                                                 
                                                                                
                     iptr = (int *) malloc(sizeof(int));                        
                     *iptr = 421;                                               
                     printf("Содержимое iptr: %p\n", iptr);                     
                     printf("Адресуемое значение: %d\n",*iptr);                 
                  }                                                             
                                                                                
          Эта версия позволяет вполне обойтись без описания переменной          
     ivar, которое    непременно  фигурировало  в предыдущих примерах.          
     Вместо адреса этой переменной iptr присваивается  значение  (тоже          
     адрес некоторой ячейки памяти),  возвращаемое некоторой функцией,          
     которая называется malloc, и описана в библиотеке alloc.h (отсюда          
     появление директивы #include в начале программы).  Затем по этому          
                                                                                
     адресу присваивается значение 421 и переменная *iptr вновь, как и          
     в предыдущем примере, принимает значение 421.                              
                                                                                
          Обратите внимание,   что если вы теперь выполните программу,          
     то получите иное значение iptr, чем раньше, но значение *iptr ос-          
     танется равным 421.                                                        
                                                                                
          Разберем теперь, что же делает оператор                               
                                                                                
                    iptr = (int *) malloc(sizeof(int));                         
                                                                                
          Разобьем его на части:                                                
                                                                                
             - выражение  sizeof(int)   возвращает  количество байтов,          
               требуемое для хранения переменной типа int; для  компи-          
               лятора Турбо Си,  работающего на IBM PC, это возвращае-          
               мое значение равно 2.                                            
                                                                                
             - функция malloc(num)  резервирует  num  последовательных          
               байтов доступной (свободной) памяти в компьютере, а за-          
               тем возвращает начальный адрес размещения в памяти этой          
               последовательности байтов.                                       

                         - 487,488 -
                                                                                
                                                                                
             - выражение (int *)  указывает,  что этот начальный адрес          
               суть указатель на данные типа int. Выражение такого ви-          
               да известно     как  выражение  приведения  типа  (type          
               casting). В  данном случае Турбо Си не  требует  обяза-          
               тельного его применения. Но в связи с тем, что для дру-          
               гих компиляторов Си это выражение  является  обязатель-          
               ным, при    его  отсутствии  вы  получите  сообщение об          
               ошибке:                                                          
                                                                                
                        " Non-portable pointer assignment."                     
               (Непереносимое в другие системы присваивание указателя)          
                                                                                
               Из соображений  переносимости программного обеспечения,          
               лучше всегда предусматривайте явное приведение типов  в          
               своих программах.                                                
                                                                                
             - наконец,   адрес,  полученный с помощью функции malloc,          
               запоминается в iptr. Таким образом, вами получена дина-          
               мически созданная  целая переменная к которой вы можете          
               обращаться при помощи идентификатора *iptr.                      
                                                                                
                                                                                
                                                                                
          Весь этот блок можно описать следующим образом:  "выделить в          
     памяти компьютера некоторый участок для переменной типa int,  за-          
     тем присвоить начальный адрес этого участка переменной iptr,  яв-          
     ляющейся указателем на переменную типа int".                               
                                                                                
          Необходимо ли все это?  Да.  Почему?  Потому что без этого у          
     вас нет гарантии, что iptr указывает на свободный участок памяти.          
     iptr будет   содержать некоторое значение,  которое вы будете ис-          
     пользовать в качестве адреса,  но вам не будет известно,  не  ис-          





пользуется ли уже этот раздел памяти для других целей. Правило использования указателей простое: указатель всегда должен иметь адрес до своего использования в программе. Иными словами, не присваивайте целое значение *iptr без предварительного присвоения адреса в iptr. - 489,490 - Указатели и функции ----------------------------------------------------------------- В прошлой главе мы объяснили, как объявлять параметры функ- ций. Возможно теперь вам более понятна причина использования ука- зателей в качестве формальных параметров функции, значения кото- рых вы можете изменять. Рассмотрим, например, следующую функцию: void swap(int *a, int *b) { int temp; temp = *a; *a = *b; *b =temp; } Эта функция swap (обмен) объявляет два формальных параметра a и b, как указатели на некие данные типа int. Это означает, что функция swap работает с адресами целых переменных (а не с их зна- чениями). Поэтому будут обработаны данные, адреса которых переда- ны функции во время обращения к ней. Далее представлена программа, вызывающая swap: main() { int i,j; i = 421; j = 53; printf("До обращения: i=%4d, j=%4d\n",i,j); swap(&i,&j); printf("После обращения: i =%4d, j=%4d\n",i,j); } Вы видите, что эта программа действительно заменяет значение i на значение j (переставляет их местами). Заменим эту программу на аналогичную ей, раскрыв процедуру swap в теле программы: main() { int i,j; - 491,492 - int *a,*b,temp; i = 421; j = 53; printf("До обработки: i = %4d j = %4d\n",i,j); a = &i; b = &j; temp = *a; *a = *b; *b =temp; printf("После обработки: i = %4d j = %4d\n",i,j); } Эта программа, конечно, приводит к тому же результату, что и предыдущая, поскольку не отличается от нее. При вызове функции, swap(&i,&j) значения двух фактических параметров (&i,&j) присваи- ваются двум формальным параметрам (a и b), обрабатываемым непос- редственно операторами функции swap. Адресная арифметика ----------------------------------------------------------------- Каким образом вам необходимо поступить, если вы хотите так модифицировать программу, чтобы iptr указывала на три переменных типа int вместо одной? Далее представлено одно из возможных реше- ний: #include main() { #define NUMINTS 3 int *list,i; list = (int *) calloc(NUMINTS,sizeof(int)); *list = 421; *(list+1) = 53;


Страницы : 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 [59] 60 61 62 63 64 65 66 67 68 69


adfun.ru









Форум раскрутка сайта и интернет-реклама
реклама - рекламное агентство -
Интернет PR агентство чат и форум
волчат знакомства - сайт знакомств
бесплатные компьютерные игры
фото знакомства
новые стеклопакеты -
качественное остекление балконов
портал - пластиковые окна -
закажите окна пвх в Москве

частная стоматология в Москве:
надежная стоматологическая клиника
протезирование зубов и
отбеливание зубов в стоматологии
Музыка - скачать mp3 музыка
каталог партнерские программы
ручной бесплатный обмен ссылками цифровые камеры цифровые фотоаппараты -
цифровые видеокамеры

театры - заказ билетов в театр -
магазин - продажа компьютеров
в Москве форум Испания - жилье -
недвижимость в испании

турфирма - испания туры
Переводы - бюро переводов
Законы - закон о товарных знаках,
Грузовые перевозки. АсМАП. Дальнобой закон о рекламе
Интернет казино
реклама на форуме и контекстная реклама
на Яндексе Баннерная сеть и
интернет каталог сайтов Holiday.Ru
Форумы политика, лучшие анекдоты
знакомства.