Другие языки программирования и технологии
Чем указатели отличаются от переменных? (С++)
Только поглубже если можно, а то информация в книжках не заполняет дыру по этому поводу.
Ничем, указатель это переменная. Просто значением указателя является адрес другой переменной.
Тебе нужно разобраться с тем, как устроенна оперативная память компьютера, что бы понять указатели.
Оперативная память состоит из ячеек имя-->значение, и можно представить так (все значения идут в 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();
}
Тебе нужно разобраться с тем, как устроенна оперативная память компьютера, что бы понять указатели.
Оперативная память состоит из ячеек имя-->значение, и можно представить так (все значения идут в 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();
}
Указатель, это переменная, которая содержит адрес первого байта того объекта (числовая переменная, строка, массив, структура, экземпляр класса и т. д.) , на который указывает. Над указателями выполняется всего две унарных операции, первая & - операция взятия адреса, вторая, * - операция разыменования указателя.
int a = 5, b; // создали две переменные.. .
int * ptr; // ...и указатель
ptr = &a; // взяли адрес переменной a
b = *ptr; // занесли в переменную b, данные по указателю ptr
// теперь a и b равны, а по указателю ptr хранится только адрес первого байта переменной a
Тип указателя определяет количество занимаемой объектом памяти.
int a = 5, b; // создали две переменные.. .
int * ptr; // ...и указатель
ptr = &a; // взяли адрес переменной a
b = *ptr; // занесли в переменную b, данные по указателю ptr
// теперь a и b равны, а по указателю ptr хранится только адрес первого байта переменной a
Тип указателя определяет количество занимаемой объектом памяти.
Типом, и соответственно доступными операторами и поправками к ним. Например, когда ты делаешь над указателем ++,адрес инкрементируется не на 1, а на размер типа данных, на который указывает указатель. Для указателя доступны операторы ->, квадратные скобочки и оператор разыменования.
Похожие вопросы
- Чем отличается в языке С++ объявление указателя на переменную int *a от int* a?
- Скорость работы указателей и переменных? С++
- Чем указатели лучше переменных?
- Указатели это переменные в которых содержатся адреса других переменных?
- да зачем нужны эти указатели ?? C++. Зачем нужны указатели? почему не обойтись без простой переменной??
- Список с использованием указателей на Си
- Зачем нужны указатели в c++? Нельзя ли обычными переменными пользоваться?
- Два вопроса про указатели в С++ внутри.
- Вопрос про указатели в С++ внутри
- СЛОЖНА! С++ Начал читать про указатели. Скопилось куча вопросов. Помогите!