Опубликован: 10.12.2015 | Уровень: для всех | Доступ: платный
Лекция 9:

Определение указателей

Ключевые слова: переменная-указатель

В языке C++ существуют объекты, которые называются указателями. Значениями указателей служат адреса участков памяти, выделенных для объектов конкретных типов. Поэтому в определении указателя всегда присутствует обозначение соответствующего типа. Выделяют указатели на объекты и указатели на функции (с ними мы познакомимся чуть позже). Рассмотрим указатели на объекты. В простейшем случае определение и описание указателя имеет следующий вид:

тип_указателя *имя_указателя;

Например, int *pointer;

Обычно, при определении указателя производят и инициализацию указателя:

тип_указателя *имя_указателя инициализатор;

В языке С++ понятия указателей, массивов и строк тесно связаны. Существует операция взятия адреса (&), с помощью которой можно узнать адрес переменной в памяти.

Переменная, в которой хранится адрес, например, переменная pi_address, называется переменной-указателем, или просто указателем (pointer). Для обращения к содержимому ячейки, адрес которой хранится в pi_address, достаточно перед указателем поставить звездочку: *pi_address. Это действие называется разыменованием указателя pi_address. Рассмотрим несколько примеров объявления и инициализации указателей:

//==========================================================
// Name        : pointer.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	//Определили и инициализировали переменную pi
	double pi=3.14159;
//Определеили и инициализировали указатель на переменную pi
	double *pointer_pi=π
	//Значение переменной pi
	cout<<"\npi="<<pi;
	//Адрес переменной а
	cout<<"\npointer_pi="<<pointer_pi;
	//Разыменование указателя
	cout<<"\n*pointer_pi="<<*pointer_pi;

	cout<<"\n"<<endl;

	//Определили и инициализировали переменную pi
	double e=2.718182;
	//Определеили указатель на переменную e
	double *pe;
	//Инициализировали указатель на переменную pi
	pe=&e;

	cout<<"\ne="<<e;
	cout<<"\npe="<<pe;
	cout<<"\n*pe="<<*pe;

	cout<<"\n"<<endl;
	return 0;
}

Результат:

pi=3.14159
pointer_pi=0x0066FDF0
*pointer_pi=3.14159

e=2.718182
pointer_e=0x0066FDE4
*pointer_e=2.71818

Использование указателей

Очень часто указатели используются при работе с массивами. Известно, что имя массива представляет собой константу, значение которой равно адресу первого элемента.

Строки являются массивами символов (тип char). Так как указатель типа char может хранить адрес символа, такой указатель можно объявить и инициализировать, а затем по имени указателя вызывать символьный массив.

//==========================================================
// Name        : pointer_char.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;

int main() {
	char *name="Marat";
	cout<<"\nHi! What is your name?";
	cout<<"\nMy name is  "<<name<<endl;
	return 0;
}

Результат:

Hi! What is your name?
My name is Marat

В следующем примере демонстрируется использование указателей на символьные массивы для того, чтобы написать фразу задом наперед, при этом использовалась библиотечная функция strlen из библиотеки string.h для вычисления длины строки.

//==========================================================
// Name        : pointer_string.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================

#include <iostream>
using namespace std;
#include<string.h>//Библиотека работы со строками

int main() {
	char *a="A ROZA UPALA NA LAPU AZORA";

//strlen() - библиотечная функция подсчета длины строки.
//Так в конце строки находится последний пустой символ,
	//от величины n вычитается единица
	int n= strlen(a)-1;

	for (int i=n;i>=0;i--)
	{
	cout<<a[i];
	}

	cout<<"\n"<<endl;

	for (int i=0;i<=n;i++)
	{
	cout<<a[i];
	}

	cout<<"\n"<<endl;
	return 0;
}

Результат:

AROZA UPAL AN ALAPU AZOR A
A ROZA UPALA NA LAPU AZORA

В другом примере используются указатели на вещественные массивы, где они (указатели на вещественные массивы) выступают в качестве аргументов функций. Подробнее о функциях речь пойдет ниже.

//==========================================================
// Name        : pointer_to_array.cpp
// Author      : Marat
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//==========================================================


#include <iostream>
using namespace std;

void print(double *a, int array_size)
{
	for(int i=0;i<array_size;i++)
	{
		cout<<"\na["<<i+1<<"] = "<<a[i];
	}
	cout<<"\n"<<endl;
}

int main() {
	void print(double *a, int array_size);

		double a[]={1.3, 4, 5.8, -3.6, 3.16};

		int array_size=sizeof(a)/sizeof(a[0]);

		print(a, array_size);
	return 0;
}

Результат:

a[1]=1.3
a[2]=4
a[3]=5.8
a[4]=-3.6
a[5]=3.16
Зося Ковалева
Зося Ковалева

Хочу получить удостоверение. Сколько стоит оплата?

Aleksey Aplaev
Aleksey Aplaev
Россия, Chelybinsk
Александр Сидоров
Александр Сидоров
Россия, Самара