Ввод значения для динамически выделяемой памяти во время выполнения - PullRequest
0 голосов
/ 04 октября 2018

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

void main()
{
    clrscr();
    int *p = new int[5];
    int *a = new int();
    cin >> *a;   // **line 5**
    cout << *a << "\n"; //  **line 6**
    cout << &p;   // line 7
    cout << *p;    // line 8

    cout << "\nEnter 5 no for array\n";
    for (int i = 0; i <= 4; i++)
    {
        cout << &p[i] << "  :-  ";
        cin >> p[i];   // LINE 12
    }

    for (i = 0; i <= 4; i++)
        cout << "\n" << p[i];     // LINE 16

    delete[] p;
    delete a;
    getch();
}

Я хотел бы знать, что при вводе данных для пользователя в целочисленном виде мы должны использовать *a с cin и cout для ввода данных в строки 5 и 6, но в случае массива мы просто дали имя переменной указателя в строке 12 и 16. Может кто-нибудь сказать, почему у нас такая разница?

Кроме того, кто-нибудь может также подсказать разницу между выводом строки 7 и 8.

1 Ответ

0 голосов
/ 04 октября 2018

Вам не «нужно»;Вы могли бы написать cin >> a[0].

Для встроенных типов и указателей и т. п. a[b] - это *(a+b) - *(b+a) - b[a], и вы можете поменять их все.

Это только соглашение, которое ведет к выбору.Как обычно, если бы вы выделили более одного int, вы бы использовали «нотацию массива» (a[i]), а если бы вы выделили только один int, вы бы использовали прямую разыменование (*(a+0))или *a).

Но на самом деле язык не заботится о том, сколько элементов вы разместили, потому что в любом случае у вас просто есть указатель на «один или несколько» последовательных элементов.

tl; dr это так, как был разработан синтаксис.

Что касается вашего второго вопроса, &p и *p дают разные результаты, потому что они означают разные вещи, и я оставлю распознавать эту разницу как упражнение.читателю.

...