В игре Source SDK
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здравствуйте.
В этом уроке:1) Указатели
2) Ссылки
Указатели предназначены для хранения адресов областей памяти.
Они позволяют работать с объектом на прямую не копируя его.
Указатели могут быть на:
1) Объект
2) Функцию
3) на тип void
Объявляется так:
Код:
тип *имя = &имя переменной
Код:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int i = 50;
int *ptr = &i;
std::cout << i << " - " << ptr << endl;
return 0;
}
& - оператор взятия адреса.
Мы объявляем и инициализируем переменную с типом int и значением 50.
Далее мы объявляем указатель на переменную i.
Т.е. ptr содержит адрес на i.
После запуска программы мы увидим что-то типо: 50 - 06FHEJKS.
Справа - адрес на переменную i.
Для вывода информация из указателя его надо разыменовать.
Код:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int i = 50;
int *ptr = &i;
std::cout << i << " - " << *ptr << endl;
return 0;
}
Так-же мы можем ввести данные через указатель
Код:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int i = 50;
int *ptr = &i;
cout << i << endl;
cin >> *ptr;
cout << i << endl;
return 0;
}
Инициализация:
Код:
тип &имя = имя переменной;
Код:
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int i = 50;
int &ref = i;
cout << i << " - " << ref << endl;
ref = 44;
cout << i << " - " << ref << endl;
return 0;
}
Отличие ссылки от указателя:
1) Указатель может быть переназначен сколько угодно раз, а ссылка нет.
2) Ссылки всегда на что-то указывают, а указатель может указывать и на NULL.
3) Нельзя получить адрес ссылки.
Передача переменной в ссылку
Код:
#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdlib>
using namespace std;
void Func(int *i, int *iS)
{
cout << *i << " and " << *iS << endl;
}
int main()
{
setlocale(LC_ALL, "Russian");
int a = 5, b = 40;
Func(&a, &b);
return 0;
}
Поэтому в вызове функции мы передаём адрес на переменную, а не её саму.
Если необходимо работать с указателями на тип void:
Код:
#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdlib>
using namespace std;
int main()
{
setlocale(LC_ALL, "Russian");
int i = NULL;
void *vPtr = nullptr;
vPtr = &i;
*((int*)vPtr) = 200;
cout << *((int*)vPtr) << endl;
return 0;
}
По этому нужно выполнить явное преобразование типа.
Использование:
Код:
#include <iostream>
#include <string>
#include <stdio.h>
#include <cstdlib>
using namespace std;
void swap(void *i, void *it, size_t sz)
{
char *buff;
buff = (char*)malloc(sz);//
memcpy(buff, i, sz);
memcpy(i, it, sz);
memcpy(it, buff, sz);
free(buff);
}
int main()
{
setlocale(LC_ALL, "Russian");
int i = 5;
int iS = 10;
cout << i << " " << iS << endl;
swap(&i, &iS, sizeof(int));
cout << i << " " << iS << endl;
return 0;
}
Ну в этой части всё.
В следующий:
1) Ключевые слова new / delete
2) Динамические массивы
3) И ещё что-нибудь.
Задание:
Напишите функцию которая будет принимать 2 указателя на переменные и возвращать указатель на их сумму.
Далее создайте указатель и присвойте ему адрес суммы и выведете на экран.
Удачи.
Некст тема
Последнее редактирование: