Void main()
{
setlocale(LC_ALL,"russian");
double number1=7.3, number2;
char *ptr;
char s1[100], s2[100]="ABCDEFGHIJKLMNOPQRSTUVWXYZ,abcdefghijklmnopqrstuvwxyz";
//или
/*char *s1=new char[100];
char *s2=new char[100];
s2="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";*/
int i;
//1
double *fPtr;
//2
fPtr=&number1;
//3
cout << "Значение объекта на которое указывает fPtr: " << *fPtr << endl;
//4
number2=*fPtr;
//5
cout << "Значение number2: " << number2 << endl << endl;
//6
cout << "Адрес number1 (1): " << &number1 << endl;
//7
cout << "Адрес number1 (2): " << fPtr << endl;
//8
for(i=0;i<100;i++)
s1[i]=s2[i];
//или strcpy_s(s1,s2);
cout << endl;
//9
cout << "Сравнение строк с помощью цикла: " << endl;
for(i=0;i<100;i++)
if(s1[i]!=s2[i])
{
cout << "Строки не совпадают" << endl;
break;
}
else
{
cout << "Строки совпадают" << endl;
break;
}
cout << endl;
//или
cout << "Сравнение строк strcmp(s1, s2): " << endl;
if (strcmp(s1, s2) == 0)
cout << "Строки совпадают" << endl;
else
cout << "Строки не совпадают" << endl;
cout << endl;
//10
cout << "Добавим 10 символов строки s2 в s1: " << endl;
strncat_s(s1,s2,10);
cout << s1 << endl << endl;
//11
int count=0;
while(s1[i]!='\0')
{
count++;
i++;
}
cout << "Длина строки s1 while: " << count << endl;
//или
cout << "Длина строки s1 strlen(s1): " << strlen(s1) << endl << endl;
//12
char k[2]=",";
ptr=strtok(s2,k);
cout<<"Первая лексема: "<<ptr<<endl;
system("pause");
}
Задание 4
а) exchenge
#include <iostream>
using namespace std;
void exchenge(double *x, double *y);
Void main ()
{
setlocale(LC_ALL, "Russian");
double x=5, y=0, *xPOINT,*yPOINT;
xPOINT=&x;
yPOINT=&y;
exchenge(xPOINT,yPOINT);
system("Pause");
}
void exchenge(double *xPOINT,double *yPOINT)
{
cout<<"Функция работает!"<<endl;
}
б) evaluealuete
#include <iostream>
#include <string>
using namespace std;
int value=5;
int poly (int value);
int (*point)(int)=&poly;
int evaluealuete(int value,int (*point)(int));
Void main ()
{
cout<<evaluealuete(value,point);
cin.get();
}
int poly (int value)
{ value++;
return value;
}
int evaluealuete(int value, int (*point)(int))
{
int z=2*value;
return z+(*point)(value) ;
}
Задание 5
#include <iostream>
#include <conio.h>
using namespace std;
int main()
{
int *zPtr;
//равенство указателя нулю не делает его абсолютно "безопасным"
//В нашем случае присваивание посредством p будет присваиванием по нулевому адресу, что обычно вызывает разрушение программы
int *aPtr= NULL;
int *sPtr = NULL;
int number,i;
int z[5]={1,2,3,4,5};
/*ошибочной есть строка sPtr=z, т.к. в задании сказано что zPtr ссылается на массив z*/
zPtr=z;
/*1) Ошибка заключается в том что zPtr изначально не инициализировання переменная,
т.е. не имеет начального значение, поэтому не может быть увеличена. Исправим ошибку*/
//zPtr++;
/*2) Нельзя делать так: number=zPtr; потому что zPtr указатель и он должен быть присовен как узказатель.
Удалим строку.*/
//number=zPtr;
/*3) Обращение к II элементу массива в виде *zPtr[2] записано не верно, следует это делать так:
number=*(zPtr+2)или так number=zPtr[2]; Исправим ошибку*/
number=zPtr[2];
/*4) Ошибка в том что подсчет элементов массива начинается с НУЛЯ, поэтому последний элемент данного
массива будет иметь индекс 4, а не 5. Исправим ошибку тут for(i=0;i<*=*5;i++)*/
for(i=0;i<5;i++)
cout << zPtr[i] << endl;
/*5) для объекта типа указатель на объект неопределённого типа отсутствует информация о размерах и
внутренней структуре адресуемого участка памяти. Из-за этого не могут быть определены какие-либо
операции для преобразования значений.
Поэтому переменной sPtr невозможно присвоить никаких значений без явного преобразования этих значений
к определённому типу указателя. Исправим ошибку, удалим строку number=*sPtr;*/
//number=*sPtr;
/*6) Т.к. у нас константный массив возникает ошибка в строке ++z; Для исправления ошибки массив следует объявить так:
int *z=new int[10];*/
//++z;
/*7) Копируемое слово меньше чем выделенный массив символов, и последние 5 символов выводятся крякозябрами. Происходит
утечка памяти*/
char s[10];
cout << strncpy(s,"Hello",5) << endl;
/*8) нельзя производить переопределение в одной и той же функции. Удалим строку char s[12]; А так же ошибка в том что
при копировании фраза "Welcome home" не помещается в массив символов т. к. забыт символ конца строки.*/
//char s[12];
//cout << strcpy(s,"Welcome home") << endl;
/*9) В даннной строке ошибка в том что не определены идентификаторы string1 и string2. Удалим строку*/
//if(strcmp(string1,string2))
//cout << "строки равны" << endl;
system("pause");
return 0;
}
Задание 6
#include<iostream>
#include<conio.h>
using namespace std;
void f(const int *);
int main()
{
int y;
f(&y);
getch();
return 0;
}
void f(const int*xPtr)
{
/*невозможно присваивать какие либо значение переменной, которая объявлена как константа*/
//*xPtr=100;
}
Задание 7
/*Результат программы полностью адекватен, т.к. задача функции выводить на экран
конст значение xPtr и адрес этого константного значения xPtr. Вызывая функцию мы
присваеваем ей константное значение y=10*/
#include<iostream>
#include<conio.h>
using namespace std;
void f(const int *);
int main()
{
int y=10;
f(&y);
getch();
return 0;
}
void f(const int*xPtr)
{
cout << *xPtr << endl << endl;
cout << &*xPtr << endl;
}
Контрольные вопросы
Указатель, в отличии от обычных переменных, представляет собой адрес памяти, который указывает (или ссылается) на определенный участок.
Инициализировать указатель, то есть при описании присвоить ему начальное значение можно сразу Int *z=10; либо присвоить указателю адрес уже инициализированной переменной так: *j=&i;
Число NULL.
Адресация — осуществление ссылки (обращение) к устройству или элементу данных по его адресу; установление соответствия между множеством однотипных объектов и множеством их адресов; метод идентификации местоположения объекта.
Разыменование - основная операцией при работе с указателями, позволяет получить доступ к значению, адрес которого хранится в указателе.
Например:
int *pn, n;
*pn = 5;
n = *pn;
Если указатель имеет тип void, то ему можно присвоить любой другой тип указателя.