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 и пока неопределенным числом элементов.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.