programing

숫자의 제곱을 계산하는 방법을 이해할 수 없습니다.

goodcopy 2022. 8. 3. 21:36
반응형

숫자의 제곱을 계산하는 방법을 이해할 수 없습니다.

숫자의 제곱을 계산하는 함수를 찾았습니다.

int p(int n) {
    int a[n]; //works on C99 and above
    return (&a)[n] - a;
}

2 n을 반환합니다.문제는 어떻게 그렇게 하냐는 거죠.약간의 테스트를 거쳐서, 나는 두 사람 사이에(&a)[k] ★★★★★★★★★★★★★★★★★」(&a)[k+1]sizeof(a)/sizeof(int) 그럴까왜런그 일일?

'수치'는 '수치' 사용하지 않고 ''를 제곱하는 *연산자(연산자)

(&a)[n] 

합니다.int

(a + sizeof(a[n])*n)

그래서 전체적인 표현은

  (&a)[n] -a 

= (a + sizeof(a[n])*n -a) /sizeof(int)

= sizeof(a[n])*n / sizeof(int)
= sizeof(int) * n * n / sizeof(int)
= n * n

a 「」의입니다.n int.

&a는 (어느쪽이든)입니다.n int.

(&a)[1]입니다.intint마지막 배열 요소를 지났습니다.는 「」입니다.n int「」의 요소&a[0].

(&a)[2]입니다.intint2개의 어레이의 마지막 어레이 요소를 지나갑니다.는 「」입니다.2 * n int「」의 요소&a[0].

(&a)[n]입니다.intint인 ""를 ""를 통과합니다.n is. 이 포인터는 이 is is입니다.n * n int「」의 요소&a[0]요.&a[0] ★★★★★★★★★★★★★★★★★」a ''가 있어요.n.

되지 않은 입니다.이 동작은, 사용의 머신으로 동작합니다.(&a)[n]는 배열 내부 또는 마지막 배열 요소를 가리키지 않습니다(포인터 산술의 C 규칙에 따라 필요).

이 해킹을 이해하려면 먼저 포인터의 차이를 이해해야 합니다., 같은 배열의 요소를 가리키는 두 개의 포인터를 빼면 어떻게 됩니까?

한 포인터를 다른 포인터에서 빼면 포인터 사이의 거리(배열 요소에서 측정)가 됩니다.만약에 '만약에'가pa[i] ★★★★★★★★★★★★★★★★★」qa[j]는, 와 같습니다.

C11: 6.5.6 가법 연산자(p9):

두 개의 포인터를 빼면 둘 다 같은 배열 객체의 요소를 가리키거나 배열 객체의 마지막 요소를 가리킵니다. 그 결과 배열 요소의 첨자가 다릅니다. [...]
은 「」, 「」의 경우입니다.P ★★★★★★★★★★★★★★★★★」Qi 및 -th ★j배열 객체의 -번째 요소. 이 유형 객체에 적합할 경우 식에 값이 있습니다.ptrdiff_t

입니다.a의 첫 합니다.a&a블록 입니다.a아래 그림은 ()read this answer for detailed explanation을 이해하는 데 도움이 됩니다.

여기에 이미지 설명 입력

이것은 왜 그런지를 이해하는데 도움이 될 것이다.a그리고.&a같은 주소 및 방법을 가지고 있습니다.(&a)[i]i 어레이의th 주소입니다(사이즈가 같은 경우).a).

그래서, 그 진술은

return (&a)[n] - a; 

와 동등하다

return (&a)[n] - (&a)[0];  

그리고 이 차이는 포인터 사이의 요소 수를 줄 것이다.(&a)[n]그리고.(&a)[0], 즉,n각 어레이n int요소들.따라서 총 어레이 요소는 다음과 같습니다.n*n=n를 클릭합니다2.


주의:

C11: 6.5.6 가법 연산자(p9):

2개의 포인터가 감산되면 양쪽 모두 같은 배열 객체의 요소 또는 배열 객체의 마지막 요소 뒤에 있는 요소를 가리켜야 합니다.그 결과 두 배열 요소의 첨자 차이가 발생합니다.결과의 크기는 구현 정의이며, 그 유형(부호가 있는 정수 유형)은 다음과 같습니다.ptrdiff_t 되어 있다<stddef.h>머리글결과를 해당 유형의 개체로 나타낼 수 없는 경우 동작은 정의되지 않습니다.

★★(&a)[n]도, .(&a)[n] - a정의되지 않은 동작을 호출합니다.

함수의 .p로로 합니다.ptrdiff_t

같은 배열의 두 요소를 가리키는 두 개의 포인터가 있는 경우 포인터의 차이로 인해 이들 포인터 간의 요소 수가 산출됩니다.예를 들어 이 코드 조각은 2를 출력합니다.

int a[10];

int *p1 = &a[1];
int *p2 = &a[3];

printf( "%d\n", p2 - p1 ); 

이제 표현을 생각해 봅시다.

(&a)[n] - a;

은 '''입니다.a은 ★★★★★★★★★★★★★int *첫 번째 요소를 가리킵니다.

&a은 ★★★★★★★★★★★★★int ( * )[n]이미지화된 2차원 배열의 첫 번째 행을 가리킵니다. 값은 '보다 낫다'의 값과 합니다.a입입르르르르르르르 르

( &a )[n]

이 은 "2차원 배열"입니다.int[n]아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.으로 현상 in in in in(&a)[n] - a타입이 int *.'는 ' *'입니다.

ㅇㅇㅇㅇㅇㅇ 사이에서(&a)[n] ★★★★★★★★★★★★★★★★★」an개의 요소 행이 있습니다. 차이가 됩니다.n * n.

Expression     | Value                | Explanation
a              | a                    | point to array of int elements
a[n]           | a + n*sizeof(int)    | refer to n-th element in array of int elements
-------------------------------------------------------------------------------------------------
&a             | a                    | point to array of (n int elements array)
(&a)[n]        | a + n*sizeof(int[n]) | refer to n-th element in array of (n int elements array)
-------------------------------------------------------------------------------------------------
sizeof(int[n]) | n * sizeof(int)      | int[n] is a type of n-int-element array

따라서,

  1. (&a)[n]int[n]
  2. aint

, 이제 입니다.(&a)[n]-a는 포인터합니다.

  (&a)[n]-a
= ((a + n*sizeof(int[n])) - a) / sizeof(int)
= (n * sizeof(int[n])) / sizeof(int)
= (n * n * sizeof(int)) / sizeof(int)
= n * n

언급URL : https://stackoverflow.com/questions/27828822/cant-understand-this-way-to-calculate-the-square-of-a-number

반응형