2016-05-01 4 views
1

Я новичок в программировании, и я пытаюсь склонить голову к идее «указателей».Что именно является целью (звездочки) в указателях?


int main() 
{ 
    int x = 5; 
    int *pointerToInteger = & x; 
    cout<<pointerToInteger; 

} 

Почему это, что, когда я cout << pointerToInteger; выход значение hexdecimal, но когда я использую cout << *pointerToInteger; выход 5 (х = 5).

+0

Первый - это указатель (то есть адрес памяти) - это шестнадцатеричное значение. Другое содержимое этого адреса. –

+0

'*' перед указателем означает «де-ссылку» на указатель или пересечь его. '*' после типа указывает указатель на тип. Указатель - это просто направление где-то в памяти, где хранится данная часть информации. –

+0

'cout << pointerToInteger 'указывает адрес, на который указывает' pointerToInteger'; 'cout << * pointerToInteger' печатает * содержимое *, сохраненное по этому адресу. Подумайте об этом так: 'pointerToInteger' - почтовый ящик перед вашим домом; '* pointerToInteger' - это то, что находится внутри этого почтового ящика. –

ответ

11

* имеет различное значение в зависимости от контекста.

  1. Декларация указателя

    int* ap; // It defines ap to be a pointer to an int. 
    
    void foo(int* p); // Declares function foo. 
            // foo expects a pointer to an int as an argument. 
    
  2. разыменования указателя в выражении.

    int i = 0; 
    int* ap = &i; // ap points to i 
    *ap = 10;  // Indirectly sets the value of i to 10 
    
  3. Оператор умножения.

    int i = 10*20; // Needs no explanation. 
    
2

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

Например:

int a;

int* b = &a;

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

Например: short и short*.

Есть два способа «смотреть на» переменной b (это то, что, вероятно, путает большинство начинающих):

  • Вы можете рассмотреть b как переменную типа int*.

  • Вы можете рассмотреть *b как переменную типа int.

    Следовательно, некоторые люди объявят int* b, тогда как другие объявят int *b.

    Но факт в том, что эти два объявления идентичны (пробелы бессмысленны).

    Вы можете использовать либо b как указатель на целочисленное значение, либо *b в качестве фактического целочисленного значения.

    Вы можете получить (прочитанное) указанное значение: int c = *b.

    И вы можете задать (написать) указанное значение: *b = 5.


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

Например:

int* a = (int*)0x8000000;

Здесь мы имеем переменную a, указывающие на адреса памяти 0x8000000.

Если этот адрес памяти не отображается в пространстве памяти вашей программы, любая операция чтения или записи с использованием *a скорее всего приведет к сбою вашей программы из-за нарушения доступа к памяти.

Вы можете смело изменить значение a, но вы должны быть очень осторожны, изменяя значение *a.

3

Один из способов взглянуть на него, является то, что переменная в исходном коде /, скажем

int a=0; 

Делает «Int А» относятся к значению в памяти 0. Если мы делаем новую переменную , на этот раз (потенциально меньше) "ИНТ указатель", int *, и он указывает на & а (адрес: а)

int*p_a=&a; //(`p_a` meaning pointer to `a` see hungarian notation) 

hungarian notation wiki

мы получаем p_a, что указывает на то, что значение &a есть. Ваш разговор о том, что находится в адресе a, теперь tho, а * p_a - указатель на все, что находится на & a (адрес a).

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

p_a сам по себе имеет след в памяти однако (потенциально меньше, чем сама a), и когда вы cout<<p_a<<endl; вы будете писать то, что указатель адрес есть, а не там, Что. *p_a однако будет &a.

p_a обычно меньше, чем a сам, так как его указатель на память, а не само значение. Имеет ли это смысл? Вектор указателей будет легче управлять, чем вектор ценностей, но они будут делать то же самое во многих отношениях.