Печать адреса массива с использованием "имени массива" и "адреса массива имени"
Кто -то, пожалуйста, объясните вывод следующего кода..
#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
прибытиеby
sizeof( 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
,