Указатель на указатель - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Подскажите, пожалуйста, в чём разница между (arr+1) и *(arr+1). Почему при их печати ( printf("%i\n",(arr+1)); и printf("%i\n",*(arr+1)); ) выводятся одинаковые числа, но printf("//%i\n",*(*(arr+1)+2)); и printf("%i\n",*((arr+1)+2)); выводят разные числа?
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int arr[2][3];
    arr[0][0]=789;
    arr[0][1]=578;
    arr[0][2]=344;
    arr[1][0]=870;
    arr[1][1]=900;
    arr[1][2]=123;
    printf("%i\n",sizeof(int));
    printf("%i\n",sizeof(arr));
    printf("adr[0][0]= %i\n",&arr[0][0]);
    printf("adr[0][1]= %i\n",&arr[0][1]);
    printf("adr[0][2]= %i\n",&arr[0][2]);
    printf("adr[1][0]= %i\n",&arr[1][0]);
    printf("adr[1][1]= %i\n",&arr[1][1]);
    printf("adr[1][2]= %i\n",&arr[1][2]);
    //printf("%i\n",*(*(arr+1)+2));
    printf("%i\n",arr);//&arr[0][0]
    printf("%i\n",(arr+1));//&arr[1][0]
    printf("%i\n",(arr+2));//&arr[2][0]
    printf("%i\n",(arr+3));//&arr[3][0]
    printf("%i\n",(arr+4));//&arr[4][0]
    printf("%i\n",(arr+5));//&arr[5][0]
    printf("//%i\n",*arr);//&arr[0][0]
    printf("%i\n",*(arr+1));//&arr[1][0]
    printf("%i\n",*(arr+2));//&arr[2][0]
    printf("%i\n",*(arr+3));//&arr[3][0]
    printf("%i\n",*(arr+4));//&arr[4][0]
    printf("%i\n",*(arr+5));//&arr[5][0]
    printf("//%i\n",**(arr)); //arr[0][0]
    printf("%i\n",**(arr+1));//arr[1][0]
    printf("%i\n",**(arr+2));//arr[2][0]
    printf("%i\n",**(arr+3));//arr[3][0]
    printf("%i\n",**(arr+4));//arr[4][0]
    printf("%i\n",**(arr+5));//arr[5][0]
    printf("//%i\n",*(*(arr+1)+2));
    printf("%i\n",*((arr+1)+2));
    return 0;
}

Решение задачи: «Указатель на указатель»

textual
Листинг программы
    int arr[2][3]={{789,578,344},{870,900,123}};
    printf("%i\n\n",arr);//начальный адрес
    printf("%i\n",arr+1);//+1*3*4
    printf("%i\n",*(arr+1));//изменился только тип,но не значение int**->int*
    printf("%i\n",**(arr+1));//870
    printf("%i\n",*(*(arr+1)+2));//123
    printf("%i\n",*(arr+3));//+3*3*4

Объяснение кода листинга программы

  1. Объявляется двумерный массив arr[2][3] и инициализируется значениями {789,578,344},{870,900,123}.
  2. Выводится начальный адрес arr.
  3. Выводится адрес arr+1, который является адресом второго элемента первого подмассива (789).
  4. Выводится значение по адресу arr+1, которое является значением второго элемента первого подмассива (578).
  5. Выводится значение по адресу **(arr+1), которое является значением второго элемента второго подмассива (870).
  6. Выводится значение по адресу ((arr+1)+2), которое является значением третьего элемента второго подмассива (123).
  7. Выводится адрес arr+3, который является адресом третьего элемента первого подмассива (344).

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

7   голосов , оценка 4 из 5
Похожие ответы