Примеры использования указателей

Пример 1. Объявить и инициализировать переменную типа float и указатель на нее. Вывести на экран содержимое области памяти, на которую указывает этот указатель.

#include <stdio.h>

int main()

{

float f=100.25;

float *pi=&f;

printf(“Значение переменной f= %f \n”,f);

printf(“Адрес переменной f: pi=%p\n”,&f); //Форматная спецификация %p

//используется для печати значения указателя

printf(“Cодержимое ячейки по адресу pi %f”,*pi);

return 0;

}

Пример 2. Задать значения двух целых переменных. Используя указатели на них, поменять значения этих переменных.

#include <stdio.h>

int main()

{ int *px, *py, x=5,y=10; // px и py являются указателями

int temp;

px = &x; py = &y;

printf(“x=%3d; y=%3d \n”, x,y);

temp=*px; // Переменной temp присваивается значение, на которое указывает px

*px=*py; // Теперь по адресу px находится значение y

*py=temp;

printf(“x=%3d; y=%3d \n”, x,y);

return 0;

}

Ссылки

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

тип &имя_ссылки=имя_переменной;

например, int &rt = t;. Оператор ссылки (&) выглядит так же, как оператор адреса, который используется для возвращения адреса при работе с указателями. Но это не одинаковые операторы. При определении ссылки необходимо ее инициализировать. Если объявить ссылку без инициализации, будет сгенерирована ошибка компиляции. Так как ссылка является псевдонимом своего адресата, то применение оператора взятия адреса к ссылке возвратит адрес ее адресата. Переназначить ссылку нельзя. Она ссылается на свой адресат и только на него. Когда указатели не инициализированы, им следует присваивать нулевое значение (0). Это не касается ссылок. Ссылка не может быть нулевой.

Пример 1.

Дана переменная x и ссылка на нее. Изменить значение ссылки и после этого вывести на экран значение переменной x.

#include <stdio.h>

int main()

{

int x;

int &rx=x; // rx – ссылка на x

x=5;

printf(“x=%d \n”, x); // Значение переменной x

printf(“rx=%d \n”,rx); // совпадает со значением ссылки rx

rx = 7; // Меняем значение ссылки,

printf(“x=%d \n”, x); // что автоматически меняет значение переменной x

printf(“rx=%d \n”,rx);

return 0;

}

Пример 2.

Дано a,b. Найти s=a+b. Изменить значения переменных с помощью ссылки на них.

#include <stdio.h>

int main()

{

int a,b,s;

int &ra=a, &rb=b, &rs=s;

printf(“введите a,b\n”);

scanf(“%d%d”,&a,&b); /* Ввод чисел a и b */

s=a+b;

/* Выводим адреса переменных a, b, s, и значений переменных a, b, s */

printf(“&a=%d &b=%d &s=%d a=%d b=%d s=%d\n”,(int)&a,(int)&b, (int)&s,a,b,s);

/* Вывод на экран значений адресов ссылок ra, rb, rs, и значений самих ссылок ra, rb, rs, что полностью эквивалентно предыдущему выводу*/

printf(“&ra=%d &rb=%d &rs=%d ra=%d rb=%d rs=%d\n”,(int)&ra, (int)&rb, (int)&rs,ra,rb,rs);

/* Изменение значений ссылок ra, rb, rs, что эквивалентно

изменению значений переменных a,b,s */

ra=ra*2;

rb=rb*2;

rs=ra+rb;

printf(“&a=%d &b=%d &s=%d a=%d b=%d s=%d\n”,(int)&a, (int)&b, (int)&s,a,b,s);

printf(“&ra=%d &rb=%d &rs=%d ra=%d rb=%d rs=%d\n”,(int)&ra,

(int)&rb, (int)&rs,ra,rb,rs);

}

Связь между переменной, ячейкой памяти, указателем и ссылкой на переменную показана на рисунке 5.1.

Рисунок 5.1 – Переменная, ссылка и указатель на переменную.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: