Пожалуйста, объясните вывод? - PullRequest
3 голосов
/ 19 сентября 2011

Кто-нибудь может объяснить странный вывод программы, которую я знаю, что значение не имеет ничего общего со значением, хранящимся в массиве, но с указателем, но как второе значение будет 5:

int main()
{
    int **h;
    int a[2][2]={1,2,3,4};
    h=(int **)a;
    int i,j;
    printf("%d",*h);
    (*h)++;
    printf("\n%d",*h);

    getch();
    return 0;
}

Ответы [ 3 ]

4 голосов
/ 19 сентября 2011

Происходит то, что *h имеет тип int*, который является указателем.

Когда вы увеличиваете, оно будет фактически увеличиваться на 4, а не на 1. Поэтому число, которое вы печатаете в конце, равно 1 + 4 = 5.

Вот ваш код с большим количеством отпечатков:

  int **h; 
  int a[2][2]={1,2,3,4}; 
  h=(int **)a; 

  cout << h[0] << endl;
  cout << h[1] << endl;
  cout << h[2] << endl;
  cout << h[3] << endl;

  int i,j; 
  printf("%d",*h); 
  (*h)++; 
  printf("\n%d",*h); 

  cout << endl;
  cout << h[0] << endl;
  cout << h[1] << endl;
  cout << h[2] << endl;
  cout << h[3] << endl;

Вывод:

00000001
00000002
00000003
00000004
1
5
00000005
00000002
00000003
00000004

Таким образом, вы можете увидеть первое значение, увеличиваемое на 4. Потому что 4 - это размер указателя при компиляции для 32-разрядного.

0 голосов
/ 19 сентября 2011

Поскольку выражение *h имеет тип pointer , в игру вступает арифметика указателей.Помните, что арифметика указателей учитывает размер базового типа;для любого указателя типа T *p выражение p++ будет продвигать указатель p на sizeof T байт.

Поскольку *h является указателем, инициализированным значением 1, выражение (*h)++ читается как «добавление sizeof (int *) байтов к 1», что в вашем случае, очевидно, равно 4. Отсюда вывод 5.

0 голосов
/ 19 сентября 2011

С помощью оператора h=(int **)a; вы выделили только адрес памяти (первый) массива a для h. Вы также определили h как указатель на указатель , который также может указывать на двумерный массив, как вы сделали. Также видно, что вы не сделали h двумерный массив (рекурсивно malloc). По printf("%d",*h); вы пытаетесь получить доступ к значению по адресу, хранящемуся в h.

Массивы хранят значения в памяти двумя способами: по столбцам или по строкам . В любом случае места памяти последовательны, в вашем случае также. Так, h хранит адрес памяти первого элемента массива a. Поэтому, когда вы используете *h, он извлекает значение по адресу, хранящемуся в h, т.е. первое значение в массиве a. И когда вы увеличиваете *h на (*h)++, он увеличивается, потому что *h все еще является указателем, и, как вы знаете, увеличение указателя не означает увеличение на 1, оно фактически увеличивается на 4 .

Следовательно, вы получаете вышеупомянутую свою продукцию.

От вас приветствуются дальнейшие обсуждения Ankit .

Сандип

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