Указатели в С++ или ссылка на переменную

 

int main () {
     int balance;
     int *balptr; // создаем указатель с помощью *
     int value;
    balance = 3200;
    balptr = &balance; // в переменную balptr помещается АДРЕС (внутренней памяти компа) переменной balance
    value = *balptr; // унарный оператор * ссылается на ЗНАЧЕНИЕ переменной, заданной операндом balptr, то есть переменная value получает значение по адресу взятому в balptr
    cout << "Баланс равен: " << value << '\n'; // 3200
}

 

К сожалению, знак умножения (*) и оператор со значением “по адресу” обозначаются одинаковыми символами “звездочка”, что иногда сбивает с толку новичков в языке C++. Эти операции никак не связаны одна с другой. Имейте в виду, что операторы '*' и '&' имеют более высокий приоритет, чем любой из арифметических операторов, за исключением унарного минуса, приоритет которого такой же, как у операторов, применяемых для работы с указателями.

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

 

 

Присваивание значений с помощью указателей

 

*p = 100; // число 100 присваивается области памяти, по адресу который расположен в p

 

Пример 1:

    int *p, num;
    p = &num; // в р - адрес по которому расположена переменная num
    *p = 200; // по этому адресу записываем числр 200, которое можно взять используя переменную num 
    cout << num; // 200
    (*p)--;
    (*p)--;
    cout << num;  // 198

Пример 2:

 

double x, y;
double *p;
x = 123.2;
p =  &x;
y = *p;
 
cout << y; //123.2
 
(*p)++;
 
cout << x; //124.2
cout << y; //123.2

 

 

Указатели и массивы

Указатель на массив устанавливается по умолчанию на первый элемент массива.

 

    int *p, num[10];

    p = num; // р указывает на элемент массива num[0]
    cout << p; 
    p = &num[3]; // здесь ставим знак амперсант и указываем номер элемента массива, адрес которого мы хотим получить
    cout << p;

 

 

 

Изменяя указатели, можно гулять по переменным или по массиву:

 

int *i, j;
double *f, g[10];
int x;
 
j = 22;
 
i = &j;
f = g;
 
for(x=0; x<10; x++)
cout << i+x << ' ' << f+x << '\n'; // к int будет добавляться 4 байта (в 32-раздрядной среде) а к double 8

 

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

Пример, программа которая из строки выделяет слова, разделенные пробелами:

 


char str[80];
char token[80];
char *p, *q; // делаем указатели на два массива, они позволят перемещаться по элементам строкового массива
cout << "Введите предложение:"; gets(str);
p = str; //ставим указатель р на массив, чтобы "гулять" по массиву БЫСТРЕЕ
 
// Считываем лексему из строки,
while(*p) {
    q = token; // Устанавливаем q для указания на начало массива token
   
    /* Считываем символы до тех пор пока не встретится либо пробел, либо нулевой символ (признак завершения строки)
    while (*p!=' ' && *p!='\0' ) {
        *q = *p;
        q++; p++; // переходим на следующий элемент массива
    }
 
 
    if (*p) p++; // Перемещаемся за пробел. Если мы в середине строки, то просто идем на следующую букву,
              //если  в конце, то то перехода не будет, чтобы следующая иттерация while смогла остановится встретив \0
             // иначе мы выйдем за область массива и могут возникнуть непредвиденные ситуации
 
    *q = '\0'; // Завершаем лексему нулевым символом
    cout << token << '\n';
}

 

 

Более удобный синтаксис указателя на массив

 

char str[20] = "I love you";
char *p;
int i;
p = str;
for(i=0; p[i]; i++) p[i] = toupper(p[i]);
cout << p; // I LOVE YOU
cout << str; // I LOVE YOU

 

 

Еще альтернативная запись указателя на массив

 

Следующая инструкция, при выполнении которой элементу num [ 3 ] присваивается значение 100:
*(num+3) = 100;

 

 

Запись и чтения массива с помощью указателей

 


#include <iostream>
using namespace std;
int main () {
    int *start, *endd;
    int arr[5];
    start = arr; // ставим указатель на начало массива
    endd = &arr[4]; // ставим указатель в конец массива
    while (start <= endd) {
        cout << "input:";
        cin >> *start; // записываем число в массив (УКАЗАТЕЛЬ СО ЗВЕЗДОЧКОЙ)
        *start++; // следующий элемент массива
    }
    start = arr;//восставливаем указатель
    while (start <= endd) {
        cout << *start << " "; // читаем элемент массива
        *start++;
    }
}

 

Источник: й


Другие ответы на вопрос: Указатели в С++ или ссылка на переменную


Имя:*
E-Mail:
Напишите ваш ответ:
Вопрос:
Skolko buдет пять пдюс сeмь?
Ответ:*

255

QQpedia.ru - cамые интересные вопросы