숫자의 제곱을 계산하는 방법을 이해할 수 없습니다.
숫자의 제곱을 계산하는 함수를 찾았습니다.
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
따라서,
- 의
(&a)[n]int[n] - 의
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
'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 |