![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Связь указателей и массивов
Указатели и массивы в языке С тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива int p[10], p p[0] имеют одинаковые значения, т.к. адрес первого (с индексом 0) элемента массива это адрес начала последовательно расположенных элементов массива. Рассмотрим обращение к элементам массива на примере. Пусть объявлены - массив из 100 бъектов типа float и указатель на объект типа float: float p[100]; float *q; int i; если выполнить операцию q=p; то обращения к элементу массива p: p[i] *(q+i) и *(p+i) эквивалентны. Таким образом, для любых указателей можно использовать две эквивалентные формы выражений для доступа к элементам массива: q[i] и *(q+i). Первая форма удобнее для читаемости текста, но вторая обычно эффективнее по быстродействию программы. Очевидна эквивалентность выражений & q[0] < -> & (*q) < -> q // адрес нулевого элемента массива *q < -> q[0] // значение нулевого элемента массива
Для определения размера памяти, необходимого для размещения объектов в языке С используется унарная операция: int sizeof (параметр); параметр – тип объекта или его идентификатор (только не имя функции). Операция sizeof возвращает размер памяти в байтах, отводимый под объект. Если указан идентификатор сложного объекта (массив, структура, объединение), то результатом является размер всего сложного объекта. Например: sizeof(int) результат 2 байта, int b[5]; sizeof(b) результат 10 байт; int c[3][4]; sizeof(c) результат 24 байта. Нарпимер: char *m[]={" Winter", " Spring", " Summer", " Automn" }; k=sizeof(m)/sizeof(*m); printf(" \n Количество строк = %d", k);
Пример 1: Упорядочить по алфавиту массив строк (не более 20) длиной не более 10 символов в каждой: #include< conio.h> #include< stdio.h> #include< string.h> void main() { char s[20][10], r[10]; int i, j, n; clrscr(); puts(" Веди количество слов \n"; scanf(“%d”, & n); for(i=0; i< n; i++) scanf(" %s", & s[i]); for(i=0; i< (n-1); i++) for(j=(i+1); j< n; j++) if(strcmp(s[i], s[j])> 0) { strcpy(r, s[i]); strcpy(s[i], s[j]); strcpy(s[j], r); } for(i=0; i< n; i++) printf(" \n %s", s[i]); getch(); } Пример 2: Проверить, является ли введенная строка полиндромом (справа-налево читается также как и слева-направо). #include < stdio.h> #include < string.h> #include < conio.h> void main(void) { char *s, *s1; // Обьявление строки указателем int i, k; clrscr(); puts(" Введите исходную строку"); gets(s); k=strlen(s); puts(" РЕЗУЛЬТАТЫ РАБОТЫ ПРОГРАММЫ\n"); for (i=0; i< k; i++) printf(" %c", s1[i]=s[k-i-1]); // Переворачиваем строку s s1[k]=’\0’; // Устанавливаем конец строки printf(“ %s\n”, strcpy(s1, s)? ” YES - Polindrom! ”: ” NO! ”) printf(" \n Press any key..."); getch(); }
|