programing

m이 3x3 행렬일 때 m[1] - m[0]이 3을 반환하는 이유는 무엇입니까?

sourcejob 2023. 9. 16. 08:59
반응형

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. [....]

더 나은 시각화를 위해 다음 이미지를 참조하십시오.

enter image description here

여기서,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

반응형