Урок по C++ №7, часть 1

В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Здравствуйте.
В этом уроке:
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;
}
Результат 50 - 50.

Так-же мы можем ввести данные через указатель
Код:
#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;
}
Как мы видим функция принимает 2 указателя на int.
Поэтому в вызове функции мы передаём адрес на переменную, а не её саму.


Если необходимо работать с указателями на тип 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;
}
Переменная не может иметь тип void.
По этому нужно выполнить явное преобразование типа.

Использование:
Код:
#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;
}
Эта функция может принимать 2 любые переменные (массивы) 1 типа (НО любого) и размер самого типа данных(нужен для memcpy).

Ну в этой части всё.
В следующий:
1) Ключевые слова new / delete
2) Динамические массивы
3) И ещё что-нибудь.

Задание:
Напишите функцию которая будет принимать 2 указателя на переменные и возвращать указатель на их сумму.
Далее создайте указатель и присвойте ему адрес суммы и выведете на экран.

Удачи.

Некст тема
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
10 Фев 2017
Сообщения
195
Реакции[?]
42
Поинты[?]
0
Код:
#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;
}
То есть это мы узнаём адрес ячейки в памяти числа 50?
Мне сложно
Я ретард, поэтому не увидел ниже....
 
Пользователь
Статус
Оффлайн
Регистрация
10 Фев 2017
Сообщения
195
Реакции[?]
42
Поинты[?]
0
Задание №1 (напиши правильно-ли я сделал)
Вот, что-то наколбасил. Вроде правильно, а вроде что-то я не понял.
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа
cout << sum << endl;     //выводим сумму
system("pause");
return 0;
}
Вот задание №2 (так же напиши правильно-ли)
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
int *ptr = &sum;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа 
cout << sum << endl;     //выводим сумму
cout << sum << " - " << ptr << endl; //выводим адрес суммы
system("pause");
return 0;
}
 
Последнее редактирование:
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
У ме
Задание №1 (напиши правильно-ли я сделал)
Вот, что-то наколбасил. Вроде правильно, а вроде что-то я не понял.
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа
cout << sum << endl;     //выводим сумму
system("pause");
return 0;
}
Вот задание №2 (так же напиши правильно-ли)
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
int *ptr = &sum;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа
cout << sum << endl;     //выводим сумму
cout << sum << " - " << ptr << endl; //выводим адрес суммы
system("pause");
return 0;
}
У меня 1 задание всего
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Задание №1 (напиши правильно-ли я сделал)
Вот, что-то наколбасил. Вроде правильно, а вроде что-то я не понял.
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа
cout << sum << endl;     //выводим сумму
system("pause");
return 0;
}
Вот задание №2 (так же напиши правильно-ли)
Код:
#include"stdafx.h"
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{
int num1, num2, sum;
int *ptr1 = &num1;
int *ptr2 = &num2;
int *ptr = &sum;
cout << "num1" << endl;
cin >> *ptr1;            //вводим первое число
cout << "num2" << endl;
cin >> *ptr2;            //вводим второе число
sum = *ptr1 + *ptr2;     //складываем числа
cout << sum << endl;     //выводим сумму
cout << sum << " - " << ptr << endl; //выводим адрес суммы
system("pause");
return 0;
}
На разбирайся:
Для просмотра содержимого вам необходимо авторизоваться.
 
В игре Source SDK
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,148
Реакции[?]
806
Поинты[?]
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
Указатели могут быть на:
1) Объект
2) Функцию
3) на тип void
боже мой...

Скажу то, что сказано очень давно.
Указатель — это вид переменной, которая хранит адрес в памяти, и этот адресс, может указывать много на что, на класс, структуру, объект, функцию переменную и даже на другой указатель, который указывает на что-то еще. (пункт 3 - void*)
 
Сверху Снизу