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;
}
