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);

}


 

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

40891. Хвильовий опір хвильовода 164 KB
  Рівняння для Т, ТЕ, ТМ хвиль різні. Щоб звести їх до одного виду, використовуючи потенціали , , де - електрична скалярна функція, - магнітна скалярна функція. Якщо для Т – хвилі завжди, то , а перетворюється в нуль завдяки .
40892. Коаксіальна лінія 412.5 KB
  Таким чином, можна перетворити межу циліндричної області в межу плоскої. Тому й область перетворюється в область . Розв’язок задачі в плоскому конденсаторі:має вигляд: . Поклавши (скориставшись тим, що потенціал визначається з точністю до константи), маємо: . Скориставшись зворотнім перетворенням, одержимо:
40893. Лінії передач для інтегральних схем 207 KB
  Складність розв’язання цієї задачі полягає в тому, що граничні умови тут – нерегулярні; не можна покласти, що на поверхні. Використовують наближені методи; зокрема конформних відображень.
40894. Реальний смушковий несиметричний хвильовід 149.5 KB
  У попередній задачі ми нехтували всіма розмірами – розглядали ідеальний випадок. Тепер розглянемо реальний: скористаємося тими самими моделями: нехай розповсюджується Т – хвиля, а ми розглядаємо одну половину (симетрія).
40895. ФОРМИ БЕЗПОСЕРЕДНЬОЇ ДЕМОКРАТІЇ В УКРАЇНІ 199.5 KB
  Поняття і види форм безпосереднього народовладдя в Україні Вибори в Україні Референдуми в Україні Поняття і види форм безпосереднього народовладдя в Україні Чинна Конституція України визнала вперше не лише належність влади народу тобто володіння політичною владою як його природне право мати владу але і його право здійснювати владу. 5 Конституції України зазначається що право визначати і змінювати конституційний лад в Україні належить виключно народові і воно не може бути узурповане...
40896. Симетричний смушковий хвильовід 51 KB
  Тут менше аніж у попередній лінії оскільки ємність тут більша. Однак тут менше не в 2 рази оскільки у попередньому хвильоводі ємність враховувалась і до верхньої сторони верхньої смужки і до нижньої див. тому там ємність більша аніж у звичайному конденсаторі.
40897. Повільні хвилі 183.5 KB
  Непрямолінійний розповсюджувач меандр спіраль Для багатьох електричних приладів необхідно отримати хвилю, що рухається зі швидкістю . Це зокрема стосується приладів, у яких відбувається передача енергії та інформації від хвилі іншим носіям.
40898. Гібридні хвилі 91 KB
  У випадку розглянутому вище, хвильовода (стержня), ми маємо три граничні умови і дві константи в рівняннях, а тому рівняння в загальному випадку не буде мати розв’язків. Однак, тут нам потрібно розглядати не тільки, а і хвилю : Тепер поле описується чотирма константами і відповідно чотирма граничними умовами.
40899. Об’ємні резонатори 117.5 KB
  З урахуванням граничних умов на бокових стінках (стінках хвильовода): Накладемо ще дві граничні умови: звідки одержимо - неправильно. Це тому, що не врахували відбиття від торців; правильно буде записати: