22935

ВКАЗІВНИКИ

Лекция

Информатика, кибернетика и программирование

1 довжина рядка int strlen char s { int i; for i=0; s=’ 0’; s i; return i; } int strlen char s[] { int i; for i=0; s[i]=’ 0’; i ; return i; } int strlen char s { int i; for i=0; s; s i; s трактується як булевий вираз s=0 означає лжу s=0 означає істину return i; }...

Русский

2013-08-04

53.5 KB

0 чел.

ТЕМА: ВКАЗІВНИКИ

Кожному  типу T відповідає  множина адрес полів ОП, де можуть зберігатись дані типу T. Нпр., типу  char  відповідають адреси окремих байтів ОП, типу int  адреси  2-байтних слів і т.д. Ці адреси складають тип вказівників   на T.  Як правило для подання вказівників використовують 16-ні  безнакові константи: 0X00FF(=255), 0x00FF(=255), 0x7FFF(=32767). Структура  вказівників залежить від архітектури процесора. Як правило,  ОП має сторінкову організацію, тобто розбита на сторінки (сегменти) розміром  байтів, кожна з яких має свій порядковий номер (базу). Адреса поля тоді має структуру пари (база, зсув. У межах фіксованого сегменту  вказують тільки зсув поля відносно його початку: від 0х0000  до  0x7FFF .

Син.         T *p;  /*   зимінна-вказівник  типу  Т */                             

            char *s;  /*   зимінна-вказівник  типу  char */

            char ch;  /*   змінна  типу  Т */

            int  *ip, n=10;  

& - операція взяття адреси змінної: &s, &nадреси змінних s та n.

*- операція розіменування вказівника: *p, *ip – змінна відповідного типу (T та int), що зберігається за адресою(= значенням)  вказівника.

Розіменовані змінні мають ті самі властивості, що і звичайні змінні даного типу. Нпр.,  змінна *ip може використовуватись як звичайна ціла змінна: *ip=0, n=*ip+2,  *ip<0     і т.д.

 

Адресна арифметика:  +, - , <, >, <=, >=,  !=, ++,  --  .

unsigned int k;

 

Пркл. 1 (довжина рядка)

int strlen (char *s)                                                      

{ int i;

  for (i=0; *s!=’\0’; s++)  i++;

  return i;

}

int strlen (char s[])                                                      

{ int i;

  for (i=0; s[i]!=’\0’; i++) ;

  return i;

}

int strlen (char *s)                                                      

{ int i;

  for (i=0; *s; s++)  i++;  /*   *s трактується як булевий вираз  (*s=0 означає лжу, *s!=0 означає істину )   */                                                          

  return i;

}

Табл..  Пріоритети операцій та порядок виконання

Операції

Порядок виконання

() [ ] ->

==>

! ~ ++ -- + _-  * & (тип) sizeof

<==

*  /  %

==>

+  -

==>

<<  >>

==>

<   <=   >   >=

==>

==   !=

==>

&

==>

^

==>

|

===>

&&

==>

||

==>

?:

<===

=  +=  -=  *=  /=  &=  |=  <<=  >>=

<==

,

==>

МАСИВИ ВКАЗІВНИКІВ

Пркл.

int array[10]; /* звичайний масив    */

int *pd[10];  /* масив показчиків   */

int *pd[]={&array[0], &array[2], &array[4]}  /* ініціалізований масив показчиків   */

Пркл. 2 (сортування масиву за зростанням та спаданням )

#define n 6

void main()

{ float array[]= {5.0, 2.0, 1.0, 3.0, 6.0, 4.0};

  float *pmin[n], *pmax[n], *temp;

  int i,j;

  for (i=0; i<n; i++)  pmin[i]=pmax[i]=&array[i];

  for (i=0; i<n-1`; i++)  

  for (j=i+1; j<n; j++)  

           { if (*pmin[i]< *pmin[j])  {temp=pmin[i]; pmin[i]=pmin[j]; pmin[j]=temp;

             if (*pmax[i]> *pmax[j])  {temp=pmax[i]; pmax[i]=pmax[j]; pmax[j]=temp;

           }

   printf(“\n за спаданням: \n”) ;   for (i=0; i<n-1`; i++)  printf(“\t %5.1f”, *pmin[i]);

   printf(“\n за зростанням: \n”);  for (i=0; i<n-1`; i++)  printf(“\t %5.1f”, *pmax[i]);

}

< stdlib.h>

void void malloc(unsigned int n)

Повертає безтиповий (адресу байту) вказівник на поле в динамічній памяті довжиною n  байтів. Якщо вільної такої ділянки не має, то повертає  NULL.

void  calloc(unsigned int n, unsigned int m)

Повертає безтиповий (адресу байту) вказівник на поле в динамічній пам’яті для розміщення масиву з  n елементів по  m  байтів. Якщо вільної такої ділянки не має, то повертає  NULL.

void free (void*p )  

Повертає  поле з адресою p  до вільної зони динамічної памяті

==============================================================================

ДИНАМІЧНІ МАСИВИ

ДМ – послідовності  однотипних елементів  з прямим доступом до компонент.

Пркл. 2 ( Створити  ДМ та роздрукувати його, розпочинаючи  з кінця)

void   main()

{ float *p; /* адреса динамічного  масиву   */

  int i,

       n; /* довжина ДМ   */

  scanf(“%d ”, &n);

  p=(float*) calloc(n, sizeof(float));

  for (i=0; i<n; i++) { printf(“p[%d]=”, i);  scanf(“%f ”, &p[i]);}

  for (i=n-1; i>=0`; i--)  

             printf(“\t p[%d]=%f”, i, p[i]);

             

   free(p);

}

Пркл. 3 (  Динамічна матриця з рядками різної довжини)

void   main()

{ char  *line; /* адреса динамічного  масиву з компонентами – адресами рядків матриці  */

  int i,j, n,m; /* n – кількість рядків матриці */

  scanf(“%d ”, &n);

  line=(char**) calloc(n, sizeof(char));

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

       { scanf(“%d”, &m);  line[i]=(char*) calloc(m, sizeof(char));}

          for (j=0; j<m`; j++) line[i][j]=getchar();

           line[i][j]=’\0’;

        }

       ……     обробка матриці   ……………

    /* вивільнення памяті  */

     for (i=0; i<n; i++)   free(line[i]);

     free(line);

}


 

А также другие работы, которые могут Вас заинтересовать

66914. Театр и драматургия средневековья 46.5 KB
  Источником развития средневекового театра стали сельские игрища во время которых выделялись балагуры пересмешники нередко делавшие свое актерство профессией таких людей было принято называть гестрионами. Во Франции их называли жонглеры В России скоморохи...
66915. Правление Петра І 32 KB
  Софья планировала сместить Петра планировался заговор с целью убийства Петра. В этом же году сторонники Петра вместе с ним свергают Софью. 16971698 заграничное путешествие Петра Курляндия Польские земли Немецкие земли Голландия Великобритания на обратном пути в Австрию.
66916. Культура Московской Руси 40 KB
  Большое значение в возвышении Москвы имела удачная политика московских князей по отношению к монголотатарам. С 14 века князья демонстративно подчеркивают роль Москвы как национального лидера в борьбе с врагом. Этот храм должен был стать главной святыней Москвы.
66917. Культура и цивилизация, Теория культурогенеза 36 KB
  Второй подход характеризует цивилизацию как определённую ступень развития культуры. Первым эту точку зрения высказал Шотландский философ 18 века Адам Фергюссон в работе Опыт истории гражданского общества он разделил историю человеческой культуры на 3 стадии: дикость варварство цивилизованность.
66918. Болдинский период творчества 45 KB
  Это один из плодотворных периодов в творчестве А.С. Пушкина. Исследователи считают, что в это время в поэзии Пушкина доминируют 2 темы: тема поэта и поэзии («Румяный критик мой», «Ответ анониму»). Своеобразие этой темы заключается в том, что к традиционному видению...
66919. Опасности техносферы 175.12 KB
  К новым техносферным относятся условия обитания человека в городах и промышленных центрах производственные транспортные и бытовые условия жизнедеятельности. Практически все урбанизированное население проживает в техносфере где условия обитания существенно отличаются...
66920. Динамика антропологии как социальной науки 39 KB
  Просветительско-рационалистический идеал будущего развития культуры идея подхвачена от эпохи просвещения. Они пытались выстроить естественную историю культуры на закономерной основе пытались понять логику развития культуры. Он считал что многообразие культурных явлений можно свести к немногочисленным...
66921. МЕМБРАННЫЕ МЕХАНИЗМЫ ВОЗНИКНОВЕНИЯ И ПРОВЕДЕНИЯ ЭЛЕКТРИЧЕСКИХ СИГНАЛОВ 105 KB
  Для того, чтобы понять, как и почему возникает возбуждение в нервных или мышечных клетках, необходимо прежде всего уяснить основные правила обмена веществами между клеткой и окружающей её средой, поскольку ионы и небольшие молекулы одновременно растворены в водной среде клетки и во внеклеточном пространстве...