숫자의 제곱을 계산하는 방법을 이해할 수 없습니다.
숫자의 제곱을 계산하는 함수를 찾았습니다.
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]
입니다.int
int
마지막 배열 요소를 지났습니다.는 「」입니다.n
int
「」의 요소&a[0]
.
(&a)[2]
입니다.int
int
2개의 어레이의 마지막 어레이 요소를 지나갑니다.는 「」입니다.2 * n
int
「」의 요소&a[0]
.
(&a)[n]
입니다.int
int
인 ""를 ""를 통과합니다.n
is. 이 포인터는 이 is is입니다.n * n
int
「」의 요소&a[0]
요.&a[0]
★★★★★★★★★★★★★★★★★」a
''가 있어요.n
.
되지 않은 입니다.이 동작은, 사용의 머신으로 동작합니다.(&a)[n]
는 배열 내부 또는 마지막 배열 요소를 가리키지 않습니다(포인터 산술의 C 규칙에 따라 필요).
이 해킹을 이해하려면 먼저 포인터의 차이를 이해해야 합니다.즉, 같은 배열의 요소를 가리키는 두 개의 포인터를 빼면 어떻게 됩니까?
한 포인터를 다른 포인터에서 빼면 포인터 사이의 거리(배열 요소에서 측정)가 됩니다.만약에 '만약에'가p
a[i]
★★★★★★★★★★★★★★★★★」q
a[j]
는, 와 같습니다.
C11: 6.5.6 가법 연산자(p9):
두 개의 포인터를 빼면 둘 다 같은 배열 객체의 요소를 가리키거나 배열 객체의 마지막 요소를 가리킵니다. 그 결과 두 배열 요소의 첨자가 다릅니다. [...]
은 「」, 「」의 경우입니다.P
★★★★★★★★★★★★★★★★★」Q
i
및 -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]
★★★★★★★★★★★★★★★★★」a
n개의 요소 행이 있습니다. 차이가 됩니다.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
따라서,
- 의
(&a)[n]
int[n]
- 의
a
int
, 이제 입니다.(&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
'programing' 카테고리의 다른 글
Vuex에서 변환 후 값을 얻는 방법 (0) | 2022.08.03 |
---|---|
Java에서 정기적인 작업을 스케줄링하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
C에서 문자열을 정수로 변환하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
Linux에서 C 코드 내의 외부 프로그램을 인수로 실행하려면 어떻게 해야 합니까? (0) | 2022.08.03 |
C 또는 C++에서 단일 인스턴스 응용 프로그램을 만드는 방법 (0) | 2022.08.03 |