2013-04-29 3 views
0

У меня есть указатель на массив, почему он дает мне следующий результат?указатель на адрес массива минус адрес массива

int main() { 
    int b[] = {1, 2}; 
    cout << "size of int = " << sizeof(int) << endl; 
    int *pt = b; 
    int i = 0; 
    while(i++ < 2) { 
     cout << "pt = " << pt << ", b = " << b << endl; 
     cout << pt - b << endl; 
     (pt)++; 
     } 
    return 0; 
} 

Выходной код:

size of int = 4 
pt = 0x7fff576f0c2c, b = 0x7fff576f0c2c 
0 
pt = 0x7fff576f0c30, b = 0x7fff576f0c2c 
1 

пт указатель на начало массива Ь сначала, почему PT-б дает мне индекс массива, пт указывает на, а не индекс из массив умножает размер одного элемента.

ответ

-1

это потому, что ваш массив действительно адрес, и int *pt = b; по существу делает pt точно так же, как b

ваш выход просто напечатав число раз вы увеличенными pt, так как вы установите его в b

+0

Нет, массив не является указателем. – 2013-04-29 16:39:58

+0

Все еще неправильно. Массив не является адресом. – 2013-04-29 16:45:59

-1

Помните, что в конце концов указатели представляют собой простые старые ints, которые представляют собой адрес в вашем логическом пространстве. Здесь адрес b указывает на постоянство, а pt сдвигается на один.

+0

Вторая часть явно неверна. Это ** делает ** выдает смещение в массиве. – 2013-04-29 16:49:36

+0

@Guillemo Нет, фактический индекс массива **, а не смещение байта, как вы думаете. [Прочтите это.] (Http://stackoverflow.com/questions/3238482/pointer-subtraction-confusion) – 2013-04-29 16:53:16

+0

ОК, я стою исправлено. Но просто из любопытства, любой способ сдвинуть указатель на байты, а не на размер шрифта? Я думаю, может быть, какое-то кастинг может сделать трюк, но этот код будет противным. –

Смежные вопросы