C ++: массив для циклической печати адресов вместо значений - PullRequest
0 голосов
/ 30 марта 2012

это был пример, данный нам в классе.Может кто-нибудь объяснить мне, почему это печатает 29 адресов вместо 29 «0» (нули)?

int num[29]; - это массив, который выделил 29 адресов для 29 целых чисел - я получаю эту часть, но вДля цикла вы не печатаете значения в этих адресах, а не сами адреса?

Кроме того, в чем разница между (num+i) и (num[]+i)?

Я немного запутался..

#include <iostream>
#include <cmath>

using namespace std;

int main(){
    int  num[29];
    for (int i=0;i<29;i++)
        cout << (num+i) << endl;

    return 0;
}

Ответы [ 2 ]

8 голосов
/ 30 марта 2012

Причина печати адресов в том, что

(num+i)

Это адрес i-го элемента массива, а не самого i-го элемента. Если вы хотите получить i th элемент, вы можете написать

*(num + i)

Или, еще лучше:

num[i]

Что касается вашего второго вопроса - синтаксис (num + i) означает "адрес i объектов после начала num, а синтаксис (num[] + i) не является допустимым C или C ++.

Надеюсь, это поможет!

3 голосов
/ 30 марта 2012

Объявление, такое как:

int num[29];

определяет непрерывный массив из 29 целых чисел.

Для доступа к элементам массива используйте num[i], где i - индекс (начиная с 0для 1-го элемента).

Выражение num само по себе дает указатель (адрес и тип памяти) первого элемента массива.

Выражение ptr + i (гдеptr - указатель, а i - целое число) вычисляет указатель, который находится на i-й позиции (в единицах типа указателя) после ptr.

Таким образом, num + i дает указатель на элемент с индексом i.

Выражение &a дает указатель на некоторый объект a.

Выражение *ptr дает объект, на который указывает указатель ptr.

Итаквыражения a и *(&a) эквивалентны.

Таким образом, num[5] соответствует *(num+5)

, а num+5 соответствует &num[5]

и num совпадают с &num[0]

Когда вы печатаете указатель cout, он показывает свой адрес.

Когда вы печатаете объект, он печатает значение объекта.

Итак,

cout << num + 5;

будет печатать адрес 5-го (индексированного нулями) элемента num

и

cout << num[5];

напечатают значение 5-го (с нулевым индексом) элемента num

...