Примеры программ к Лабораторной работе N5. "Указатели и работа со строками"
/* day_mon3.c -- используются обозначения через указатели */
#include <stdio.h>
#define MONTHS 12
int main (void)
{
int days[MONTHS] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int index;
for (index = 0; index < MONTHS; index++)
printf("Mecяц %2d имеет %d дней.\n", index + 1, *(days + index)); // то же, что и days[index]
return 0;
}
/* p_and_s.c -- указатели и строки */
#include <stdio.h>
int main (void)
{
const char *mesg = "Непозволяйте себя запутать!";
const char *copy;
copy = mesg;
printf("%s\n", copy);
printf("mesg = %s; &mesg = %p; value = %p\n", mesg, &mesg, mesg);
printf("copy = %s; © = %p; value = %p\n", copy, ©, copy);
return 0;
}
/* pnt_add.c -- сложение указателей */
#include <stdio.h>
#define SIZE 4
int main(void)
{
short dates[SIZE];
short *pti;
short index;
double bills[SIZE];
double *ptf;
pti = dates; // назначение указателю адреса массива
ptf = bills;
printf("%23s %10s\n", "short", "double");
for (index = 0; index < SIZE; index++)
printf("указатели + %d: %10p %10p\n", index, pti + index, ptf + index);
return 0;
}
/* praise1.c -- использует различные представления строк */
#include <stdio.h>
#include <string.h>
#define PRAISE "Какое прекрасное имя!"
int main (void)
{
char name[40];
printf("Kaк Вас зовут?\n");
scanf("%s", name);
printf("Здравствуйте, %s. %s\n",name, PRAISE);
printf("Baшe имя состоит из %d символов и занимает %d ячеек памяти.\n", strlen(name), sizeof name);
printf("Хвалебная фраза содержит %d символов", strlen(PRAISE));
printf(" и занимает %d ячеек памяти. \n", sizeof PRAISE);
return 0;
}
/* ptr_ops.c -- операции над указателями */
#include <stdio.h>
int main(void)
{
int urn[5] = {100, 200, 300, 400, 500};
int *ptr1, *ptr2, *ptr3;
ptr1 = urn; // при сваивание указателю адреса
ptr2 = &urn[2]; // второй экземпляр
// разыменование указателя и взятие адреса указателя
printf("значение указателя, разыменованный указатель, адрес указателя:\n");
printf ("ptr1 = %p, *ptr1 = %d, &ptr1 = %p\n", ptr1, *ptr1, &ptr1);
// сложение указателей
ptr3 = ptr1 + 4;
printf("\ncлoжeниe значения int с указателем: \n") ;
printf("ptr1 + 4 = %p, *(ptr4 + 3) = %d\n", ptr1 + 4, *(ptr1 + 3));
ptr1++; // увеличение значения указателя на 1
printf("\n значения после выполнения операции ptr1++: \n");
printf("ptr1 = %p, *ptr1 = %d, &ptr1 = %p \n", ptr1, *ptr1, &ptr1);
ptr2--; // уменьшение значения указателя на 1
printf("\n значения после выполнения операции --ptr2:\n");
printf("ptr2 = %p, *ptr2 = %d, &ptr2 = %p\n", ptr2 , *ptr2 , &ptr2);
--ptr1; // восстановление исходного значения
++ptr2; // восстановление исходного значения
printf("\nвосстановление исходных значений указателей:\n");
printf("ptr1 = %p, ptr2 = %p\n", ptr1, ptr2);
// вычитание одного указателя из другого
printf("\nвычитание одного указателя из другого: \n");
printf("ptr2 = %p, ptr1 = %p, ptr2 - ptr1 = %d\n", ptr2, ptr1, ptr2 - ptr1);
// вычитание целого значения из указателя
printf("\nвычитание из указателя значения типа int:\n");
printf("ptr3 = %p, ptr3 - 2 = %p\n", ptr3, ptr3 - 2);
return 0;
}
// strings.c -- коллекционирование пользователей
#include <stdio.h>
#define MSG "вы должны обладать многими талантами. Назовите некоторые." // константа символьной строки
#define LIM 5
#define LINELEN 81 // максимальная длина строки + 1
int main (void)
{
char name[LINELEN];
char talents[LINELEN];
int i;
// инициализация массива значений типа char заданной размерности
const char m1[40] = "Постарайтесь уложиться в одну строку.";
// пусть компилятор сам вычислит размеры массива
const char m2[] = "Если вам ничего не приходит в голову, придумайте что-нибудь.";
// инициализация указателя
const char *m3 = "\nBce, о себе достаточно, а вас как зовут?";
// инициализация массива указателей на строку
// массив из 5 указателей
const char *mytal[LIM] = {"Мгновенное складывание чисел",
"Точное умножение", "Накапливание данных",
"Исполнение инструкций с точностью до последней буквы",
"Знание языка программирования С"
};
printf("Здравствуйте! Я компьютер по имени Клайд."" У меня масса талантов.\n");
printf("Ceйчac я расскажу кое-что о них.\n");
puts("Чтo у меня за таланты? Вот только частичный их перечень.");
for (i = 0; i < LIM; i++)
puts(mytal[i]); // печать талантов компьютера
puts(m3);
gets(name);
printf("Xopoшo, %s, %s\n", name, MSG);
printf("%s\n%s\n", m1, m2);
gets(talents);
puts("Посмотрим, есть ли у меня этот перечень:");
puts(talents);
printf("Благодарю за информацию, %s.\n", name);
return 0;
}