Связь указателей и массивов
Указатели и массивы в языке С тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива
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();
}