почему разные ответы? - PullRequest
       2

почему разные ответы?

9 голосов
/ 03 сентября 2010

Ниже приведены 2 программы

Первая

#include<stdio.h>

void main()
{
    int a[5]={1,2,3,4,5};
    int *p;
    p=&a;
    printf("%u %u",p,p+1);
}

Вторая

#include<stdio.h>

void main()
{
    int a[5]={1,2,3,4,5};
    printf("%u %u",&a,&a+1);
}

Теперь в двухпрограммы ... Я напечатал значения & a, используя p в первом коде и непосредственно во втором ..

Почему результаты отличаются?

Ответ, который я получаю:

for first  3219048884  3219048888
for second 3219048884  3219048904

Ответы [ 6 ]

14 голосов
/ 03 сентября 2010

Тип &a равен int (*) [5].Следовательно, &a+1 - это указатель, который на 5 int с дальше, чем a.Однако тип p равен int *, поэтому p+1 - это указатель, который на 1 int дальше, чем p.

7 голосов
/ 03 сентября 2010

Когда я запускаю это, я получаю это:

1245036 1245040 1245036 1245040
1245036 1245040 1245036 1245056

с единственной разницей в последней позиции, p+1 против &a+1

p - указательдо целого числа, поэтому p+1 является адресом следующего целого числа.(т.е. на 4 байта в памяти)

a - это массив из 5 целых чисел, поэтому & a + 1 - это адрес следующего массива из 5 целых чисел.(т. е. еще 20 байтов в памяти)

2 голосов
/ 03 сентября 2010

У вас есть две программы с разными кадрами стека, поэтому неудивительно, что адреса локальных переменных различны. Il может меняться каждый раз, когда вы запускаете программу (это то, что она делает, когда я ее пробую, код, скомпилированный с gcc в Linux).

Но вы получите те же значения с программой ниже единицы, за исключением последнего значения серии (кроме последнего, из-за того, как работает арифметика указателей).

#include<stdio.h>

void main()  
{ 
    int a[5]={1,2,3,4,5};  
    int *p; 
    p=&a; 
    printf("%u %u %u %u ",a,a+1,p,p+1);
    printf("%u %u %u %u",a,a+1,&a,&a+1);
}

Полное объяснение различий между указателями и массивами вы можете найти в моем ответе здесь

2 голосов
/ 03 сентября 2010

В обеих программах вы печатаете адреса памяти массива.

Это может варьироваться при каждом запуске программы. Память, которую ОС выбирает для вас, может отличаться.

Когда ваша программа объявляет массив из 5 целых чисел, ОС обещает дать вам 5 последовательных целых чисел, НЕ обещает, какую память вы получите, или что вы будете получать одну и ту же память каждый раз.

1 голос
/ 03 сентября 2010

Ваша первая программа недействительна.Недопустимо присваивать p = &a, поскольку p имеет тип int *, а &a имеет тип int (*)[5].Эти типы не совместимы.Если ваш компилятор достаточно свободен, чтобы разрешить такое назначение (он вас хотя бы предупреждал?), Он, вероятно, интерпретировал его как p = (int *) &a, то есть он принудительно интерпретирует значение &a как указатель int *.Таким образом, вся арифметика указателей в вашей первой программе int * арифметика.Вот почему первая программа выдает одинаковые выходные данные для значений a+1 и p+1.

Во второй программе значение &a не интерпретируется повторно.Он сохраняет свой оригинальный тип `` int () [5] and it follows the rules of normal pointer arithmetic for type int () [5] , meaning that when you do & a + 1 , the pointer is moved sizeof (int [5]) `байтов, как и должно,Вот почему результат отличается от первой программы.

0 голосов
/ 03 сентября 2010

Вы должны использовать p = a, а не p = &a.Массив типа a уже считается постоянным указателем.Вам не нужно разыменовывать его с помощью оператора &.

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