m이 3x3 행렬일 때 m[1] - m[0]이 3을 반환하는 이유는 무엇입니까?
이게 내 암호입니다.
int m[][3] = {
               { 0 , 1 , 2  },
               { 10, 11, 12 },
               { 20, 21, 22 }
             };
printf("%d %d\n", m[1] - m[0], m[1][0] - m[0][0]);
그리고 왜 그럴까요?
m[1] - m[0]
돌아가다3? 두번째 표현이 왜 돌아오는지 알아요10하나는st 제가 보기엔 논리적이지 않은 것 같아요
코드:
 m[1] - m[0]
는 유형에 따라 두 포인터의 차이를 알려주는 포인터 뺄셈을 나타냅니다.이 경우 두 포인터 모두 3개의 요소로 차별화되므로 결과는 3입니다.
인용하자면C11표준, § 6.5.6장
포인터 두 개를 뺄 때, 둘 다 같은 배열 객체의 요소를 가리키거나 배열 객체의 마지막 요소를 지나 하나를 가리킵니다. 결과는 두 배열 요소의 첨자 차이입니다. [...]
그리고.
[...] 즉, 만약 그 표현들이
P그리고.Q각각 다음을 가리킵니다.i-손에j- 배열 객체의 요소, 식(P)-(Q)가치가 있습니다.i−j유형의 개체에 적합한 값이 있는 경우ptrdiff_t. [....]
더 나은 시각화를 위해 다음 이미지를 참조하십시오.
여기서,s는 다음과 같이 정의되는 2차원 배열입니다.s[4][2]. 어레이 컨슈머의 데이터 타입을 각각 2바이트씩 고려하여 요소(인덱스)와 해당 메모리 위치(임의)를 따라주시기 바랍니다.이렇게 하면 메모리에서 배열 요소가 실제로 얼마나 연속적인지 더 잘 이해할 수 있습니다.
그래서, 표현에 의하면,s[0]그리고.s[1]두 가지 요소로 구별됩니다.s[0][0]그리고.s[0][1].이런 이유로,s[1] - s[0]2의 결과를 만들어 낼 것입니다.
왜냐하면 그 사이의 "차이"가m[1]그리고.m[0]는 3가지 요소입니다.
이렇게 보면 좀 더 이해하기 쉬울 수도 있습니다.
m[0] m[1] m[2]| | |vvvv+---------+---------+---------+---------+---------+---------+---------+---------+---------+| m[0][0] | m[0] | m[0][1] | m[0][2] | m[1][0] | m[1][1] | m[1][2] | m[2][0] | m[2] | m[2][1] | m[2][2] |+---------+---------+---------+---------+---------+---------+---------+---------+---------+
사이의 차이m[1]그리고.m[0]는 3가지 요소입니다.m[0][0],m[0][1]그리고.m[0][2].
언급URL : https://stackoverflow.com/questions/35844279/why-does-m1-m0-return-3-where-m-is-a-3x3-matrix
'programing' 카테고리의 다른 글
| withCount 메서드에서 where 절을 사용하는 Laravel (0) | 2023.09.16 | 
|---|---|
| 세션의 CSRF 보호 토큰을 노출하는 것이 안전합니까? (0) | 2023.09.16 | 
| 폭 100% HTML 테이블, tbody 안에 세로 스크롤 포함 (0) | 2023.09.16 | 
| 저장소를 사용하지 않고 호스트 간에 도커 이미지를 복사하는 방법 (0) | 2023.09.16 | 
| XML에서 잘못된 문자는 무엇입니까? (0) | 2023.09.16 | 
