Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по программированию.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
116 Кб
Скачать
☆

Void main( )

{

int x,y;

long int z;

int k;

int *pi1, *pi2;

long int *pli;

pi1=&x; pi2=&y;

printf (“%d\n”, pi2-pi1); // -1

pi2=&k;

printf (“%d\n”,pi2-pi1); // -4

pli=&z;

printf(“%d %d\n”,(int)pi2,int(pli)); // -20 -18

printf(“%d\n”,(long int*)pi2-pi1);//

pi2=&y (“%d\n”,(longint*)pi2-pi1); //1

printf(“%d\n”,pi2-(int*)pli); //2

printf(“%d\n”,(longint*)pi2-pli); //

}

В языке Си адрес программного объекта может хранить также ссылочные переменные, которая объявляется следующим образом:

тип &имя_ссылки = имя_программного_объекта

Ссылка по сути является вторым именем переменной и может использоваться в программе как ее дубликат. В этом случае и переменная и ссылка используют одну и ту же область памяти. Поскольку ссылка хранит адрес самой переменной.

Int l=8;

int &reff=l;

l++;

reff=reff+5;

printf(“%d”,reff);

Массивы и адресная арифметика.

  • Сложение указателей

Складывать два указателя даже одного типа запрещено. Однако указател можно увеличить на целочисленную константу, при этом указатель увеличивается на велечину константа*размер_элемента_базового_типа

  • Энкримент/декримент указателя выполняется по правилам увеличения/уменьшения указателя на числовую константу равную единице.

  • Операции *,++,--,& являются равноправными и левонаправленными. Изменить порядок можно с помощью скобок. Рассмотрим сложение указателей на примере массива. Имя массива с точки зрения системы программирования Си представляет собой указатель на самый первый элемент массива (элемент номер 0). с именем массива можно работать как с обычным указателем, применяя к нему адресную арифметику. Однако изменять само значение адреса нужно с осторожностью

#include <stdio.h>

Void main ()

{

int x[][3]={1,2,3,4,5,6,7,8,9};

printf(“/n%d %d %d %d”, *(*x),*(*(x+1)),*(*(*(x+1)+1)),*(*(x+2)+2));

} //1 4 5 9

Динамические массивы

В том случае когда объем обрабатываемых данных в массиве заранее неизвестен целесообразно использовать динамические массивы, выделяя память под массив во время выполения программы и точно в том объеме, который требуют исходные данные для этого достаточно определить указатель базового типа элемента массива а далее выделить память с помощью операции имя используя следующий синтаксис:

имя_указателя = new базовый_тип [количество_элементов];

Пример:

Дан двумерный массив. Разместить строки матрицы таким образом, чтобы элементы заданного столбца были упорядочены по возрастанию:

#include <stdio.h>

Void main()

{

int **arr; //Указатель на указательна целое число

int i,j,m.n.k;

printf(“Введите количество строк и столбцов”);

scanf(“%d %d”, &m, &n);

printf(“Введите элементы массива”);

arr = new int* [m];

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

{

arr[i]= new int [n];

for (j=0; j<n;j++) scanf(“%d”,&arr[i][j]);

}

printf(“Задайте номер сортируемого столбца”);

scanf(“%d”.&k);

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

{

int imin=i;

for (j=i+1; j<m;j++)

if(arr[j][k-1]<arr[imin][k-1]) imin=j;

if (imin!=i)

{

int *b;

b=arr[imin];

arr[imin]=arr[i];

arr[i]=b;

}

printf(“\n”);

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

{

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

printf(“%d”, arr[i][j]);

printf(“\n”);

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

delete [] arr[i];

delete[] arr;

}

//Читает текстовый файл в строковый массив и выводит его на экран.

#include <stdio.h>

#include <string.h>

int main()

{

FILE *f;

char txt[100][80];

int i=0,j;

f =fopen("1.txt","r");

do

{

fgets(txt[i],79,f);

txt[i][strlen(txt[i])-1]='\0';

i++;

}

while(feof(f));

i--;

for(j=0;j<i;j++) printf("%s\n",txt[j]);

while(fgets(txt[i],79,f))

{

txt[i][strlen(txt[i])-1]='\0';

i++;

}

return 0;

}

for (j...

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

#include <stdio.h>

#include <stdlib.h>

int main()

{

FILE *f;

int n,i,b;

f=fopen("2.dat","rbt");

if(f)

{

fseek(f,-2,SEEK_END);

fread(&b,sizeof(int),1,f);

fseek(f,o,SEEK_END);

}

else

{

f=fopen("2.dat","wbt");

b=0;

}

printf("%d",&n);

randomize();

for(i=0,i<n,i++)

{

b+=random(4);

printf("%d",b);

fwrite(&b,sizeof(b),1,f);

}

printf("\n"); rewind(f);

while(!feof(f))

{

if(fread(&b,sizeof(int),1,f))

printf("%d",b);

}

fclose(f);

printf("\n");

return 0;

}