Направления программирования. История создания языка Си. Особенности языка, страница 17

1)  #define size200

main()

{

float *data= (float *)malloc(size *sizeof(float);

float *end_data = data+size-1;

int i;

for(i=0;i<size;i++)

data[i]=i*10;

while(data!=end_data)

printf(“\n%f”, *data++);

}

Операция *data++ выдает значение по адресу data, далее адрес увеличивается на 1, т.е.на самом деле на zizeof(float) байтов.

Что будет напечатано если заменить выражение в фигурных скобках?

printf(“%f”, ++*data); =1 – выражение увеличивает значение *data на единицу до его использования.

printf(“%f”,*++data);=10 – адрес увеличивается на единицу, а затем выбирается значение по этому адресу, оно равно 10.                                         

2)  Скопировать строку в строку.

char *str1, *str2;

       while(*str1!=’\0’)

{ *str1=*str2; // копируем текущий символ

str1++; // переход к следующим элементам               теряем указатель на начало строк

str2++;

}

или while(*str1++=*str2++);

3)  Массивы указателей.

Массивы указателей используются в основном для инициализации строк при создании массива строк.

char *array[3]={“строка1”, “строка2”, “строка3”}       0                        maxx  

Используя массив указатели можно

разместить в динамической памяти

двумерный массив, матрицу.

       #define maxx 100

#define maxy 100

main()                                                                               maxy 

{double matr[maxx][maxy];

double *uk_str[maxx]; - объявляем массив, элементы которого указатели на строки

int i, j, k=0;

for(i=0;i<maxx;i++)

{uk_str[i]=(double*)malloc(maxy*sizeof(double)); // выделяем массив для элементов i-ой строки

for(j=0;j<maxy;j++)

*(uk_str[i]+j)=k+1; // заполняем матрицу

}

// uk_str[i]+j и uk_str[i] – различаются на j*sizeaf(double) байтов

// обработка, вывод матрицы

for(i=0;i<maxx;i++)

{printf(“\n”);

for(j=0;j<maxy;j++)

printf(“m[%d][%d]=%lf  ”,i+1, j+1, *(uk_str[i]+j));

}

}

Замечание: Для объявления указателя на многомерный массив используют следующий оператор: <идентификатор> (*<имя указателя>)[n];.

Потребность использовать указатель на многомерный массив в следующем случае: если необходимо передать функцию в качестве параметра в многомерный массив.

Т.к. имя массива является константным указателем, указывающий на 1-ый элемент, то таким образом имя массива указателя является указателем на 1-ый элемент массива, являющийся в свою очередь указателем на другую переменную типа массив, поэтому можно использовать указатель на указатель.

4)  Количество обрабатываемых данных неизвестно. Обрабатывается информация о студентах, сведенье о каждом студенте включает в себя: ФИО, год рождения, группа, № курса. Выдать список всех студентов заданного курса.

main()

{struct stud

{char fio[40];

char gr[10];

int course;}*uk_mas;

int kol_st, i, c;

printf(“количество:”);

scanf(“%d”, &kol_st);

uk_mas=(struct stud*)malloc(kol_st*sizeof(struct stud)); - выделяем память под количество студентов

for(i=0;i<kol_st;i++)

{

printf(“Данные для %d студента\n ”, i+1);

printf(“ ФИО:”);

scanf(“%s”,&uk_mas[i].fio);

printf(“год рождения:”);

scanf(“%s”,&uk_mas[i].gr);  

printf(“курс:”);

scanf(“%d”,&uk_mas[i].course);

}

printf(“Введите № курса”);

scanf(“%d”,&c);

for(i=0;i<kol_st;i++)

if(uk_mas[i].course==c)

printf(“\n%s”, uk_mas[i].fio);

free(uk_mas);

}

п.11.Строки.

В языке Си отдельного строкового типа нет, строка в Си – это одномерный массив типа char, заканчивающийся нулевым байтом, который является признаком конца строки. Для нулевого байта определена специальная константа ‘\0’(символ слеш ноль).

char str[10]; - мы задали обычный одномерный массив, но если мы хотим трактовать его как строку символов, то это будет строка максимум из 10 элементов, а последний байт зарезервирован под нулевой байт.

char *str ; - это описание представляет собой указатель на одномерный массив элементов символьного типа с начальным адресом str и пока неопределенным числом элементов.