Операция sizeof

Связь указателей и массивов

Указатели и массивы в языке С тесно связаны между собой. Имя массива является указателем на его первый элемент, т.е. для массива

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

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: