Выражение &arrayname + n
должно давать base address + (number of elements * size of type of elements) * n
, и внутри функции main()
оно работает должным образом.
Но если я использую то же самое в другой функции, оно интерпретируется по-другому и выдает другой результат.
Код (32-битный компилятор):
#include <stdio.h>
void arrf(int A[],int n)
{
printf("\n\nInside arrf()");
printf("\n&A ---> %p",A);
for(int i=0;i<n;i++)
printf("\n&A + %d ---> %p",i,(&A+i));
}
int main()
{
int A[]={1,2,3,4,5};
int n=5;
printf("Inside main()");
printf("\n&A --->%p",A);
for(int i=0;i<n;i++)
printf("\n&A + %d ---> %p",i,(&A+i));
arrf(A,n);
return 0;
}
Вывод образца:
Inside main()
&A --->0x7ffed323eac0
&A + 0 ---> 0x7ffed323eac0
&A + 1 ---> 0x7ffed323ead4
&A + 2 ---> 0x7ffed323eae8
&A + 3 ---> 0x7ffed323eafc
&A + 4 ---> 0x7ffed323eb10
Inside arrf()
&A ---> 0x7ffed323eac0
&A + 0 ---> 0x7ffed323ea88
&A + 1 ---> 0x7ffed323ea90
&A + 2 ---> 0x7ffed323ea98
&A + 3 ---> 0x7ffed323eaa0
&A + 4 ---> 0x7ffed323eaa8
Внутри main()
, &A+1
дает 0x7ffed323eac0 + Hex(5*4*1) = 0x7ffed323eac0 + 0x14 = 0x7ffed323ead4
, как и ожидалось, как и выходные данные для всех &A+i
Но в функции arrf()
выходные данные не такие, как ожидалось, даже &A+0
выдает выходные данные, отличные от базового адреса. Что еще более странно, адреса уменьшаются, а не увеличиваются. Почему?
(&A+i)
— автоматический запах кода. Это следует рассматривать как подтверждение того, что вам нужно лучше понять, как работает арифметика указателей и что на самом деле представляет собой тип выражения&A
. В данном случаеint (*)[5]
в main. Но так какA
является простым `int*` в списке параметров функции,&A
тамint**
. Таким образом разница.Могу я спросить, почему, во имя святого имени Денниса Ричи, вы вообще берете адрес этой переменной? Использование адреса массива стека почти никогда не имеет смысла.
В
main
A
имеет типint [5]
, но вarrf
A
имеет типint *
. В то время как добавление целого числа кA
будет работать одинаково в обеих функциях, добавление целого числа к&A
не будет, так как&A
имеет типint (*)[5]
вmain
иint **
в <84777919830>. Эти два типа совершенно разные и несовместимы.Обратите внимание, что если x является переменной (любого типа), то
(&x + n)
является неопределенным поведением всякий раз, когдаn > 1
.@AK Итак, если вы поняли, напишите ответ и примите это ради других.
@U.Windl Я уже принял ответ dbush