Я хочу знать, в чем разница между всеми выводами в этом коде? - PullRequest
0 голосов
/ 26 февраля 2020

Я хочу знать, в чем разница между всеми выходными данными? Почему есть четыре разных выхода?

#include <stdio.h>

int main()
{
    int arr[]={1,2,3};
    int*ptr=arr;
    printf("%d\t %d\t %d\t %p\t %d \n",arr[0],arr[1],arr[2],ptr,*ptr);
    *ptr++=-1;
    printf("%d\t %d\t %d\t %p\t %d \n",arr[0],arr[1],arr[2],ptr,*ptr);
     *++ptr=-2;
    printf("%d\t %d\t %d\t %p\t %d \n",arr[0],arr[1],arr[2],ptr,*ptr);
    (*ptr)++;
    printf("%d\t %d\t %d\t %p\t %d \n",arr[0],arr[1],arr[2],ptr,*ptr);
    return 0;
}

и это вывод

 1   2   3   0x7ffe27496054  1 
-1   2   3   0x7ffe27496058  2 
-1   2   -2  0x7ffe2749605c  -2 
-1   2   -1  0x7ffe2749605c  -1 

Ответы [ 3 ]

2 голосов
/ 26 февраля 2020

Хорошо, давайте начнем. Указатель хранит адрес памяти и дает звезду (*), прежде чем переменная-указатель будет обозначать значение этого адреса памяти.

int*ptr=arr;

В приведенной выше строке вы скопировали адрес первого индекса массива (обр) в указатель ptr. Таким образом, для первой печати значение указателя ptr - это адрес первого индекса массива, который означает arr [0].

Затем вторая строка:

*ptr++=-1;

Здесь вы пишете увеличивая значение ptr первым, так как ptr представляет адрес первого индекса массива, таким образом он будет представлять адрес второго индекса массива (arr [1]) в следующем операторе. но, поскольку он будет увеличиваться при установке значения -1, он будет установлен в позицию массива 0 (arr [0]).

Затем строка ниже:

*++ptr=-2;

Здесь вы предварительно увеличивая значение ptr, оно будет указывать адрес 3-го индекса массива (arr [2]) и, таким образом, будет устанавливать значение arr [2] равным -2.

Затем следующая строка:

(*ptr)++;

Здесь вы увеличиваете значение адреса ptr, так как в этот момент ptr указывает значение arr [2], поэтому оно будет увеличивать значение arr [2] на 1.

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

1 голос
/ 26 февраля 2020

Выражение

*ptr++ = -1;

эквивалентно

*ptr = -1;
ptr += 1;

И

*++ptr = -2;

эквивалентно

ptr += 1;
*ptr = -2;

Оба из это должно быть довольно легко вывести из вашего вывода.

Наконец

(*ptr)++;

, что эквивалентно

*ptr += 1;

, что увеличивает то, на что указывает ptr, но не ptr сам.

0 голосов
/ 26 февраля 2020

В первой строке int * ptr = arr; означает создание указателя на intger, который содержит адрес первого массива элементов как arr = arr [0], поэтому, когда print (ptr) будет адресом arr [0] и когда print (* ptr) будет печатать значение arr [0], которые равны одной

*ptr++=-1;

эта строка включает постинкремент, поэтому сначала значение arr [0] будет равно -1, затем указатель будет увеличиваться для включения адреса arr [1], поэтому при печати arr [0] будет -1, print (ptr) будет адресом второго элемента arr [1], а (* ptr) выведет значение arr [1], равное 2

 *++ptr=-2;

эта строка включает предварительное увеличение, поэтому сначала указатель будет увеличиваться для включения адреса arr [2], затем значение arr [2] будет равно -2, поэтому, когда print arr [2] будет равно -2 ,, print (ptr ) будет адресом третьего элемента arr [2] и (* ptr) выведет значение arr [2], которое равно -2

наконец

 (*ptr)++;

эта строка будет увеличивайте значение, на которое указывает указатель, поскольку () имеет высокий приоритет, поэтому (* ptr) означает значение, которое указывает r указывает на это и ++ будет увеличивать это значение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...