Другие языки программирования и технологии

Чем указатели отличаются от переменных? (С++)

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

Оперативная память состоит из ячеек имя-->значение, и можно представить так (все значения идут в hex):


Когда ты пишешь к примеру:
int a = 10;
То в программе это будет выглядеть например как:
адрес (0000 0001) = значение (0A);

Конечно по хорошему int содержит 4 байта и выглядит так: первый_адрес (0000 0001) = значение (0A 00 00 00); Но для наглядности я этим пренебрегу.

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

& - операция взятия адреса. Можно запустить и проверить:
int main(){
    int a=10; //адрес (0000 0001) = значение (0A);
    cout<<a; //cout << значение (0A);
    cout<< &a; //cout << адрес (0000 0001);
}

* - операция разыменовывания.
int main(){
    int a=10; //адрес"а"(0000 0001) = значение"а"(0A);
    int *b=&a; //Объявляем указатель и записываем адрес а. Он может хранить только адреса.
    cout<<&a<<':'<<b; //Проверяем: cout << адрес"а"(0000 0001)<< : << значение"в"(0000 0001)
    cout<< *b; //cout << значениеИзАдреса (0000 0001); и выведет 10.
}

У указателя множество применений, например в функцию передается только значение, присваиваемое локальной переменной. Но можно передать адрес через указатель и обращаться к переменной напрямую. так же он указывает на первый адрес и считывает порциями в зависимости от типа. Это пригодится в массивах и тем более в структурах данных (списки, бинарные деревья) .
int main(){
int a[5] = {0,1,2,3,4};
int *b = &a[0];
cout << *b <<" "<< *b+1 <<" "<< *b+2; //первые четыре байта, потом вторые и третьи
_getch();
}
Aliwer Dadabaev
Aliwer Dadabaev
40 015
Лучший ответ
Указатель, это переменная, которая содержит адрес первого байта того объекта (числовая переменная, строка, массив, структура, экземпляр класса и т. д.) , на который указывает. Над указателями выполняется всего две унарных операции, первая & - операция взятия адреса, вторая, * - операция разыменования указателя.

int a = 5, b; // создали две переменные.. .
int * ptr; // ...и указатель
ptr = &a; // взяли адрес переменной a
b = *ptr; // занесли в переменную b, данные по указателю ptr
// теперь a и b равны, а по указателю ptr хранится только адрес первого байта переменной a

Тип указателя определяет количество занимаемой объектом памяти.
Erlan Tabakalov
Erlan Tabakalov
68 160
Типом, и соответственно доступными операторами и поправками к ним. Например, когда ты делаешь над указателем ++,адрес инкрементируется не на 1, а на размер типа данных, на который указывает указатель. Для указателя доступны операторы ->, квадратные скобочки и оператор разыменования.