Содержание
- 2. Практические занятия Указатели на константы Чем отличается int * const от int const *. Возможен ли
- 3. Практические занятия Найти ошибку #include // Переменная var получает целое значение и используется для инициализации указателя
- 4. Практические занятия Разбить текстовую строку по символу пробела Без использования указателей С использованием указателей #include #include
- 5. Практическая работа: что делают программы Функция calloc #include #inclide #define N 100000 float *get_mem(void) { float
- 6. Примеры: Program MatrPointer; Const SizeOfReal = 6; (* Длина переменной типа REAL *) N = 100;
- 7. Лучше сделать так!!! Program MatrPointer; (* Const SizeOfReal = 6; (* Длина переменной типа REAL *)
- 9. Скачать презентацию
Практические занятия
Указатели на константы
Чем отличается int * const от int const
Практические занятия
Указатели на константы
Чем отличается int * const от int const
#include Форма int * const означает константность указателя: указатель объявленный с этим определением, не может менять адрес, на который он указывает. Форма int const * означает константность самого значения, на которое адресует указатель: адрес, на который указывает указатель можно менять, но изменить значение содержимого адреса при помощи указателя невозможно. #include Если модификации не должен подвергаться ни сам указатель, ни значение, на которое он указывает, то допускается использование типа int const * const #include И+ПРГ
main ()
{ int number = 5;
int var = 10;
int *const prt = &number;
*prt = 100; // Допустимо
prt = &var; // Ошибка
return 0; }
main ()
{ int number = 5;
int var = 10;
int const * prt = &number;
prt = &var; // Допустимо
var = 15;
*prt = 100; // Ошибка
return 0; }
main ()
{ int number = 5;
int var = 10;
int const *const prt = &number;
*prt = 100; // Ошибка
prt = &var; // Ошибка
return 0; }
Практические занятия
Найти ошибку
#include
// Переменная var получает целое значение и используется
Практические занятия
Найти ошибку
#include
// Переменная var получает целое значение и используется
main ()
{ int var, *prt;
var = 10;
*prt = var;
cout <<"\n Значение prt -> " <<* prt);
return 0; }
#include Ошибка заключается в следующем: НАДО: Ввести текстовую строку и вывести её на экран по 4-е символа в одной строке И+ПРГ #include
#include
main ()
{
char input [80];
char *current;
int i = 1;
cout << "Введите строку ->";
gets (input);
for (current=input; *current;
current++, i++)
{
cout << *current;
if (! (i % 4))
cout << endl;
}
return 0;
}
Указатель не инициализирован, он не указывает ни на одну переменную, под которую выделена статическая или динамическая память. Программа будет работать, но ошибка может проявиться сбоями программы, причём не сразу, а через некоторое время после начала работы.
// Переменная var получает целое значение и используется для инициализации переменной, на которую указывает prt
main ()
{ int var, *prt;
prt = new int;
var = 10;
*prt = var;
cout <<"\n Значение переменной, на которую
указывает prt -> " <<* prt);
delete prt;
return 0; }
Практические занятия
Разбить текстовую строку по символу пробела
Без использования указателей
С использованием
Практические занятия
Разбить текстовую строку по символу пробела
Без использования указателей
С использованием
#include #include И+ПРГ
#include
#include (string.h>
int main()
{
char input[80];
char current[80];
int i, j;
cout << "Введите строку -> ";
gets(input);
for(i = 0; i < strlen (input); i++)
{
for(j = 0; input[i] != ' ' && input[i];
j++, i++)
{
current[j] = input[i];
}
current[j] = '\0';
cout << current << endl;
} return 0;
}
#include
#include (string.h>
int main()
{ char input[80];
char current[80];
char *prt, *prt_cur;
cout << "Введите строку -> ";
gets(input);
prt = input;
while(*prt)
{ prt_cur = current;
while(*prt != ' ' && *prt)
{ *prt_cur = *prt;
prt_cur++;
prt++; }
// Пропускаем пробел
if(*prt) prt++;
*prt_cur = '\0';
cout << current << endl; }
return 0; }
Практическая работа:
что делают программы
Функция calloc
#include
#inclide
#define N 100000
float
Практическая работа:
что делают программы
Функция calloc
#include
#inclide
#define N 100000
float
{
float *p;
p = calloc(N, sizeof(float));
if (!p)
{ printf("????\n");exit(1); }
return 0; }
main ()
{ get_mem();
………………………..
return 0; }
printf("Ошибка при распределении памяти\n");
Программа возвращает указатель на динами-ческий блок памяти для массива из N чисел типа float.
Функции malloc и free
Функция realloc
#include printf("Ошибка при распределении памяти\n"); Программа распределяет блок памяти для строк, а затем освобождает этот блок. #include Программа распределяет блок памяти для 16 символов, копирует в них строку "Это– 15 символов", а затем увеличивает размер блока до 17 символов, чтобы размес-тить в конце точку и, нако-нец, освобождает этот блок. И+ПРГ
#include
int main (void)
{ char *str[10]; int i;
for (i=0; i<10; i++);
{ if ((str[i] =
(char*)malloc(10))==NULL)
{ printf ("???????\n");
exit(1); }
printf ("????????\n");
gets (str[i]); }
// ?????????
for (i=0; i<10; i++);
free (str[i]);
return 0; }
printf ("Введите строку символов\n);
// Освобождение блока памяти
#include
#include
int main (void)
{ char *p;
p = (char*) malloc(16);
if (!p)
{ printf ("???????\n"); exit(1);}
strcpy (p,"Это–15 символов\n");
p=(char*)realloc (p < 17);
if (!p)
{ printf ("???????\n"); exit(1);}
strcat (p < ".");
printf("\n"); printf(p); free(p); return 0; }
Примеры:
Program MatrPointer;
Const SizeOfReal = 6; (* Длина переменной типа REAL *)
Примеры:
Program MatrPointer;
Const SizeOfReal = 6; (* Длина переменной типа REAL *)
Var i, j : integer; PtrStr : array [1..N] of pointer; s : real;
Type RealPoint = ^real;
(*------------------------*)
Function AddrR (i, j : word) : RealPoint;
(* По сегменту i и смещению j выдает адрес вещественной переменной *)
Begin AddrR := ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^) + (j-1)*SizeOfReal);
end (* AddrR *) ;
(*-------------------------*)
Function GetR (i, j : Integer) : Real;
(* Выдает значение вещественной переменной по сегменту i и смещению j её адреса *)
Begin GetR := AddrR (i, j)^;
end (* GetR *) ;
(*-------------------------*)
Procedure PutR (i, j : Integer; x : Real);
(* Помещает в переменную, адрес которой имеет сегмент i и смещение j, вещественное значение x *)
Begin AddrR (i, j)^ := x;
end (* PutR *) ;
(*--------------------------*)
begin (* Main *)
(* Программа создает в памяти матрицу NxM случайных чисел и вычисляет их среднее значение *)
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOfReal); for j:= 1 to M do PutR (i, j, Random); end;
s := 0; for i := 1 to N do for j := 1 to M do s := s + GetR (i, j);
writeln ('Среднее значение = ', s / (N * M) : 12:10); end (* Main *) .
Что делает программа?
И+ПРГ
Лучше сделать так!!!
Program MatrPointer;
(* Const SizeOfReal = 6; (* Длина
Лучше сделать так!!!
Program MatrPointer;
(* Const SizeOfReal = 6; (* Длина
N = 100; (* Количество строк *) M = 200; (* Количество столбцев *)
Var i, j : integer; PtrStr : array [1..N] of pointer; s : real;
Type RealPoint = ^real;
(*------------------------*)
Function AddrR (i, j : word) : RealPoint;
(* По сегменту i и смещению j выдает адрес вещественной переменной *)
Begin AddrR := ptr(seg(PtrStr[i]^), ofs(PtrStr[i]^) + (j-1)*SizeOf(Real));
end (* AddrR *) ;
(*-------------------------*)
Function GetR (i, j : Integer) : Real;
(* Выдает значение вещественной переменной по сегменту i и смещению j её адреса *)
Begin GetR := AddrR (i, j)^;
end (* GetR *) ;
(*-------------------------*)
Procedure PutR (i, j : Integer; x : Real);
(* Помещает в переменную, адрес которой имеет сегмент i и смещение j, вещественное значение x *)
Begin AddrR (i, j)^ := x;
end (* PutR *) ;
(*--------------------------*)
begin (* Main *)
(* Программа создает в памяти матрицу NxM случайных чисел и вычисляет их среднее значение *)
for i := 1 to N do begin
GetMem (PtrStr[i], M*SizeOf(Real)); for j:= 1 to M do PutR (i, j, Random); end;
s := 0; for i := 1 to N do for j := 1 to M do s := s + GetR (i, j);
writeln ('Среднее значение = ', s / (N * M) : 12:10); end (* Main *) .
И+ПРГ