Печать адреса массива с использованием "имени массива" и "адреса массива имени"

Кто -то, пожалуйста, объясните вывод следующего кода..

#include <stdio.h>

    int main()
    {
        int arr[5];
        // Assume base address of arr is 2000 and size of integer is 32 bit
        printf("%u %u", arr + 1, &arr + 1);         
        return 0;
    } 

также объясните, когда оператор "printf" заменяется следующим

1. printf("%u %u", arr + 1, &(arr + 1));
2. printf("%u %u", arr + 1, &arr + 2);

3 ответа

Прежде всего лучше использовать спецификатор формата %p который специально разработан для указателей вместо спецификатора формата %u

В этом заявлении

printf("%u %u", arr + 1, &arr + 1);

в выражении arr + 1 массив arr преобразуется в указатель на свой первый элемент. Так что он имеет тип после преобразования int * и соответственно элемент, на который он указывает, имеет тип int, Из-за указателя арифметического выражения arr + 1 будет указывать на следующий элемент массива, который является вторым элементом. Так что значение указателя arr+ 1is greater than the value of pointerприбытиеbysizeof( int)`

В этом выражении &arr + 1 указатель &arr имеет тип int ( * )[5], Элемент, на который он указывает (это массив arr) имеет тип int[5], Так что значение выражения &arr + 1 больше, чем значение &arr от sizeof( int[5] )

Что касается выражения &(arr + 1) тогда он не скомпилируется, потому что arr + 1 является временным объектом, и вы не можете взять адрес временного объекта.

Вывод вышеуказанного кода - 2004 2020.

Значения arr и & arr приводят к тому же результату, что и массив неинициализирован, он печатает значение адреса вместо его значения.

Это происходит из-за того факта, что при выводе ucz (arr+1) он добавляет размер типа массива, т.е. int (4 байта), к результату

Но когда вы делаете ( &(arr+1)), он добавляет размер всего массива, т.е. (5*4=20 байт) к базовому адресу.

Когда вы печатаете & (arr+1), это выдаст ошибку bcz, теперь она будет восприниматься как одинарная, а не как оператор адресации

Выход 1-го printf будет (согласно указанному вами предположению) -2032 2160

как arr+1 указывает на следующий элемент, который является arr[1] и &arr+1 в этом arr int(*)[5] указывает на int[5] таким образом address of arr that is base address плюс размер int[5] (здесь в вашем случае 5*32).

В твоем втором printf&(arr+1) не является lvalue, поэтому не занимает определенное место в памяти. Это приведет к ошибке.

Thrid printf выдаст вывод как 2032 2320. Может оцениваться как сделано в 1-м printf,

Другие вопросы по тегам