Выходное объяснение: сложная арифметика указателя - PullRequest
1 голос
/ 05 мая 2011

Я пытался понять вывод этой программы:

#include <stdio.h>    
int main(){
    static int arr[] = {0, 1, 2, 3, 4};
    int *p[] = {arr, arr+1, arr+2, arr+3, arr+4};
    int **ptr = p;

    ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *ptr++;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    *++ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);
    ++*ptr;
    printf("%d %d %d\n", ptr-p, *ptr-arr, **ptr);    

    return 0;
}

ВЫХОД

1 1 1
2 2 2
3 3 3
3 4 4

Кто-нибудь может объяснить вывод?

Ответы [ 4 ]

8 голосов
/ 06 мая 2011

This is the initial snapshot

После первого ptr ++ это будет: enter image description here Следовательно, printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); даст: 1 1 1

После * ptr ++ это будет: enter image description here Следовательно, printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); даст: 2 2 2

После * ++ ptr это будет:

enter image description here

Следовательно, printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); даст: 3 3 3

После ++ * ptr это будет:

enter image description here

Следовательно, printf("%d %d %d\n",ptr-p,*ptr-arr,**ptr); даст: 3 4 4

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

0 голосов
/ 17 октября 2011

Главное, на что нужно обратить внимание - это арифметическая операция с указателем.

Выполните следующие действия, т.е. add + 1 = add + 1*(size of the data type of the data which is pointed by that address)

++ и -- также так.

0 голосов
/ 05 мая 2011

Я попытаюсь объяснить только первое printf.Я думаю, этого должно быть достаточно, чтобы понять остальную часть printfs.Как кто-то заметил, код основан на игре с арифметикой указателей на языке C. * Массив

arr содержит пять чисел от 0 до 4. p - это массив указателей на целые числа, и он заполняетсяс «адресами» номеров, хранящихся в arr.ptr является указателем на указатель на целое число и инициализируется с помощью p (поскольку в языке C массив указателей эквивалентен указателю на указатель).

Тогда ptrувеличивается.Имейте в виду, что мы увеличиваем адрес, поэтому теперь он указывает на элемент (arr+1) в массиве p.Вот почему ptr-p возвращает 1. Другими словами, мы вычитаем адреса.

*ptr указывает на элемент arr + 1.Вот почему второе значение также равно 1.

Делая **ptr, мы получаем значение, которое хранится по адресу arr+1, и оно также равно 1.

0 голосов
/ 05 мая 2011

Возможно, вы захотите прочитать 6.5.6 в Стандарте C99 .

В основном, для различий между указателями

  1. они должны указывать в одном массиве(или один за концом)
  2. разница в количестве элементов , которые разделяют указатели (или число байтов, разделенное на размер в байтах каждого элемента).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...