Читайте также:
|
|
*pointer = 123;
Означает "положить значение правой части (т.е. 123)
в переменную (ящик), на который указывает указатель,
хранящийся в переменной pointer".
Пройти по стрелке и положить значение в указываемую переменную.
В данном случае *pointer обозначает
не ЗНАЧЕНИЕ указываемой переменной,
а САМУ указываемую переменную.
________
/pointer/
_/_______/_
| |
| &var2 |
| |
|_______|_|
|
|Положить туда 123
|
V
________
/ var2 /
_/_______/_
| |
| 123 |
| |
|_________|
pointer = &var2;
*pointer = 123;
означает
*(&var2) = 123;
означает
var2 = 123;
То есть снова * и & взаимно СТИРАЮТ друг друга.
--------------------------------------------------------------------
Ещ? пример:
*pointer = *pointer + 66;
или
*pointer += 66;
--------------------------------------------------------------------
Вернемся к примеру с функцией (@). Как он работает?
В строке /* #1 */
Мы вызываем функцию f(), передавая в нее
УКАЗАТЕЛЬ на переменную y ("адрес переменной y").
В строке /* #2 */
Отводится локальная переменная с именем ptr,
которая в качестве начального значения
получает значение первого аргумента функции в точке вызова -
то есть УКАЗАТЕЛЬ на y.
В строке /* #3 */
Мы видим
*ptr = 7;
что следует рассматривать как
*(&y) = 7; точнее *(&main::y)=7;
то есть как
y = 7; точнее main::y=7;
Что и хотелось.
При этом отметим, что само имя "y" этой переменной
внутри функции f() НЕВИДИМО и НЕИЗВЕСТНО!
--------------------------------------------------------------------
ПРИМЕР: обмен значений двух переменных.
void main(){
int x, y;
int temporary; /* вспомогательная переменная */
x=1; y=2;
temporary=x; x=y; y=temporary;
printf("x=%d y=%d\n", x, y); /* Печатает x=2 y=1 */
}
-----------------------------------------------------------------------
Теперь то же с использованием адресов и указателей:
void swap(int *a, int *b){
int tmp;
tmp = *a; *a = *b; *b = tmp;
}
void main(){
int x, y;
x = 1; y = 2;
swap(&x, &y);
printf("x=%d y=%d\n", x, y);
}
-------------------------------------------------------------------------
Ещ? пример:
int x;
int *ptr1, *ptr2;
ptr1 = &x; ptr2 = &x;
*ptr1 = 77;
printf("%d\n", *ptr2); /* Печатает 77 */
То есть на одну переменную МОГУТ указывать несколько указателей.
-------------------------------------------------------------------------
Ещ? пример:
int x;
int *ptr1; /* Не инициализирована */
x = *ptr1;
В ptr1 нет указателя ни на что, там есть мусор.
Указатель указывает "в никуда" (пальцем в небо).
Скорее всего произойд?т сбой в работе программы.
Мораль: ВСЕГДА инициализируй переменные, указатели в том числе.
Дата добавления: 2015-08-17; просмотров: 40 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
СТЕК И ФУНКЦИИ | | | МАССИВЫ |