Курс ПЯВУ 2 сем / Практические / Пр №10. Указатели
.odtПрактическое занятие № 10. Указатели.
План занятия.
-
Указатель на константу.
-
Указатель на целую переменную.
-
Указатель на вещественную переменную.
-
Указатель на символьную переменную
-
Взятие адреса и разадресация
-
Операции с указателями.
-
Использование указателей в выражениях.
-
Указатель на произвольную ячейку памяти.
-
Указатель на указатель на указатель.
-
Указатель на массив
-
Нахождение суммы квадратов натурального ряда чисел.
-
Указатель в аргументах функции.
-
Указатель на функцию и указатели аргументы.
-
Указатель на имя функции.
1 //Указатель на константу
#include<stdio.h>
#include<stdlib.h>
int main()
{
const int i=5;
int *pi=&i;
int k;
k=*pi;
printf("i= %i pi= %u k= %i\n",i,pi,k);
system("pause");
return 0;
}
// 5 2345436 5
2 //Указатель на целую переменную.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i;
i=6;
int *pi=&i;
int k;
k=*pi;
printf("i= %i pi= %u k= %i\n",i,pi,k);
system("pause");
return 0;
}
//i=6 pi= 2686788 k= 6
3 // Указатель на вещественную переменную.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
float i;
i=6.5;
float *pi=&i;
float k;
k=*pi;
printf("i= %f pi= %u k= %f\n",i,pi,k);
system("pause");
return 0;
}
//i=6.5 pi= 2686788 k= 6.5
4 // Указатель на литерную переменную.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
char i;
i='a';
char *pi=&i;
char k;
k=*pi;
printf("i= %c pi= %u k= %c\n",i,pi,k);
system("pause");
return 0;
}
//i= a pi= 2686788 k= a
5 // Взятие адреса и разадресация.
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main(void)
{
float i,*pi,j;
pi=&i;
printf("Содержимое ячеки i= %f \n",i);
printf("Aдрес ячейки pi= %u \n",pi);
i=10.5;
printf("Содержимое ячейки i= %f \n",i);
printf("Адрес ячейки i= %u \n",pi);
printf("Содержимое ячейки j= %f \n",j);
j=*pi;
printf("Адрес ячейки j= %p \n",&j);
printf("Содержимое ячейки j= %f \n",j);
system("PAUSE");
return 0;
}
// Содержимое i = 0
// Адрес i=2293620
//Содержимое i =10.5
// Адрес i=2293620
// Содержимое j=0
// Адрес j=2293612
// Содержимое j=10.5
6 //Операции с указателями
//Арифметические операции над указателями
//Сложение и вычитание указателей с константой.
//Вычитание одного указателя из другого
//Инкремент
//Декремент.
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int a=1,b=2,c=3,d=4,f=5,k;
int *pa,*pb,*pc,*pd,*pf;
pa=&a;
pb=&b;
pc=&c;
pd=&d;
pf=&f;
printf("Содержимое ячейки a= %i адрес ячейки pa= %u \n",a,pa);
printf("Содержимое ячейки b= %i адрес ячейки pb= %u \n",b,pb);
printf("Содержимое ячейки с= %i адрес ячейки pc= %u \n",c,pc);
printf(" Содержимое ячейки d= %i адрес ячейки pd= %u \n",d,pd);
printf("Содержимое ячейки f= %i адрес ячейки pf= %u \n",f,pf);
printf("\n");
pa=pa+4;
pb=pb-4;
pc++;
pd--;
k=pa-pb;
printf("Содержимое ячейки a= %i адрес ячейки pa= %u \n",a,pa);
printf("Содержимое ячейки b= %i адрес ячейки pb= %u \n",b,pb);
printf("Содержимое ячейкиc= %i адрес ячейки pc= %u \n",c,pc);
printf("Содержимое ячейки d= %i адрес ячейки pd= %u \n",d,pd);
printf("Содержимое ячейки" k= %i \n",k);
system("pause");
return 0;
}
// a=1 pa=2686788
// b=2 pb=2686784
// c=3 pc=2686780
// d=4 pd=2686776
// f=5 pf=2687772
//a=1 pa=2686804
//b=2 pb=2686768
//c=3 pc=2686784
//d=4 pd=2686872
// k=9
7 //Использование указателей в выражениях
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int a=1,b=2,c;
int *pa,*pb,*pc;
float f;
pa=&a;
pb=&b;
c=*pa+*pb;
printf("Содержимое ячейки c=%i \n",c);
f=sin(*pa);
printf(" sin(*pa)= %f sin(a)= %f \n", f,sin(a));
system("pause");
return 0;
}
// 3
// 0.841 0.841
8 // Указатель на произвольную ячейку памяти
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int i,j,*pi,*pt;
pi=&i;
i=10;
printf("I=%i pi= %u\n",i,pi);
pt=(int*)2686788;
pt++;
printf("J= %i pt= %u \n",j,pt);
system("PAUSE");
return 0;
}//i=10 pi=2686788
// j=2686788 pt= 2686788
9 // Указатель на указатель на указатель
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
int main()
{
int i=10,*pi,**ppi,***pppi;
pi=&i;
ppi=π
pppi=&ppi;
printf("Содежимое ячейки i= %i\n",i);
printf("Адрес ячейки pi= %i\n",pi);
printf("Адрес адреса ячейки ppi= %i\n",ppi);
printf("Адрес адреса адреса ячейки pppi= %i\n",pppi);
system("PAUSE");
return 0;
}
//Содержимое ячейки i=10
//Адрес ячейки 2293620
//Адрес ячейки адреса 2293616
//Адрес адреса адреса адреса ячейки 2293612
10 //Указатель на массив
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int main()
{
int i[10];
char c[10];
float f[10];
int *pi=i;
char *pc=c;
float *pf=f;
printf("Целый массив %u\n",pi);
printf("Символьный массив %u\n",pc);
printf("вещественный массив %u \n",pf);
printf("Целый массив %u\n",i);
printf("Символьный массив %u\n",c);
printf("вещественный массив %u \n",f);
system("pause");
return 0;
}
//2686736
//2686720
//26867672
//2686736
//2686720
//26867672
}
11 // Нахождени суммы квадратов натурального ряда чисел,
расположенных в массиве
// Использование указателей для вычисления
//Найти сумму квадратов чисел до 10
//
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#define n 10
int main()
{
int a[n];
int *pa;
int i=0,j,s;
int *pi, *pj,*ps,*pa1;
pa=a;
pa1=&a[0];
pi=&i;
pj=&j;
ps=&s;
for (;pa<a+n;pa++)
{*pa=i;i++;}
for ( ;pa1<a+n;pa1++)
printf("%i ",*pa1);
printf("\n");
*ps=0;
for (pi=a;pi<a+n;pi++)
*ps+=*pi*(*pi);
printf(" Сумма s= %i \n",*ps);
system("pause");
return 0;
}
// 0 1 2 3 4 5 6 7 8 9
// S=285
12 //Указатели в аргументах функции
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
void perestanovka(int *a,int *b)
{
int r;
r=*a;
*a=*b;
*b=r;
}
int main()
{
int x=1,y=2;
int *px,*py;
px=&x;
py=&y;
printf("x= %i y= %i \n",x,y);
perestanovka(px,py);
printf("x= %i y= %i \n",x,y);
perestanovka(px,py);
printf("x= %i y= %i \n",x,y);
system("pause");
return 0;
}
// 1 2
// 2 1
// 1 2
13 //Указатель на функцию и указатели аргументы
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
float *Streug(float *pa,float *pb,float *pc);
int main()
{
float x,y,z,s;
float *px=&x,*py=&y,*pz=&z;
printf("Ввести стороны треугольнока x y z\n");
scanf("%f%f%f",&x,&y,&z);
printf("%f %f %f \n",x,y,z);
s= *Streug(px,py,pz);
printf("S= %f \n",s);
system("pause");
return 0;
}
float *Streug(float *pa,float *pb, float *pc)
#include<math.h>
{
float p,r;
p=(*pa+*pb+*pc)/2;
r=pow((p*(p-*pa)*(p-*pb)*(p-*pc)),0.5);
return (&r);
}
// x y z
// 3 4 5
// 6
14 //Указатель на имя функции
// Лр№7 произведение положительных элементов
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int *prod(int b[],int m);
int main()
{
int n=10;
int *pn=&n;
int *res;
int a[10]={1, -3, 4, -5,-3,2,2,-1,1,-2};
res=prod(a,n);
printf("Pполож.элем=%i \n",*res);
system("pause");
return 0;
}
int *prod(int b[],int m)
{
int s=1, k=0;
int *ps=&s,*pk=b;
int *pl=pk+m;
for (;pk<pl;pk++)
if (*pk>0) *ps*=*pk;
return (ps);}
// Р положэлементов = 16
Домашнее задание.
Написать программу изучения содержимого 20 ячеек памяти вблизи литерной переменной с.
Решение оформить в виде двух колонок.
Адрес Содержимое
________________________________________________________________________________