Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Курс ПЯВУ 2 сем / Практические / Пр №10. Указатели

.odt
Скачиваний:
14
Добавлен:
17.04.2015
Размер:
19.75 Кб
Скачать

Практическое занятие № 10. Указатели.

План занятия.

    1. Указатель на константу.

    2. Указатель на целую переменную.

    3. Указатель на вещественную переменную.

    4. Указатель на символьную переменную

    5. Взятие адреса и разадресация

    6. Операции с указателями.

    7. Использование указателей в выражениях.

    8. Указатель на произвольную ячейку памяти.

    9. Указатель на указатель на указатель.

    10. Указатель на массив

    11. Нахождение суммы квадратов натурального ряда чисел.

    12. Указатель в аргументах функции.

    13. Указатель на функцию и указатели аргументы.

    14. Указатель на имя функции.

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 ячеек памяти вблизи литерной переменной с.

Решение оформить в виде двух колонок.

Адрес Содержимое

________________________________________________________________________________