티스토리 뷰

Coding/C

2차원 배열의 메모리 분석

빠리빵 2018. 5. 26. 15:34
#include 

int main() {
	int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
	
	// 주소에서 덧셈 연산은 내용을 고려해서 계산된다.
	printf("%x\n", a);				// 1000
	printf("%x\n", a[0]);			// 1000	, a[0] type : int [4] , 내용 type : int
	printf("%x\n", a[0] + 1);		// 1004	, 4 증가 , a[0] type : int [4] , 내용 : int , 연산 4 증가
	printf("%d\n", *a[0]);			// 1
	printf("%d\n", *(a[0] + 1));	// 2 , a[0][1] 동일
	printf("%x\n", *a);				// 1000 , *a type : int [4] 
	printf("%x\n", a + 1);			// 1010 , 16 증가, a type : int[3][4] , 내용 type : int [4], 연산 16 증가
	printf("%x\n", *(a + 1));		// 1010 , 16 증가
	printf("%x\n", *a + 1);			// 1004 , 4 증가 , *a type : int [4] ,  내용 type : int , 연산 4 증가
	printf("%d\n", **a);			// 1
	printf("%x\n", &a + 1);			// 1030 , 48 증가 , &a type : int (*) [3][4] , 내용 type : int[3][4] , 연산 48 증가 
	printf("%x\n", *(&a + 1));		// 1030	, 48 증가 , 주소의 계산은 위와 같고 *을 붙인 값은 1030번지의 int [3][4]형 가리킨다.
	printf("%x\n", *&a + 1);		// 1010 , 16 증가 , a + 1과 동일하다. 내용 type : int [4] , 16 증가
	printf("%x\n", *(*&a + 1));		// 1010 , 16 증가 , 주소의 계산은 위와 같고 * 붙인 값은 1010번지의 int [4]형 가리킨다.
	printf("%x\n", **&a);			// 1000 , int[4] 가리킴
	printf("%d\n", ***&a);			// 1 , int

	system("pause");
}



주소의 덧셈 연산은 항상 그 변수의 타입이 아닌 내용물의 타입을 바탕으로 계산된다는 점을 유의하자.

또한 * 붙인다고 무조건 데이터에 접근하는 것은 아니다.


printf("%d\n", (*(a + 2))[2]); // a[2][2] , 11

printf("%d\n", *(a + 2)[2]); // 1040번지의 쓰레기 값, a[4] != a[1]

printf("%d\n", (a + 1)[1][3]); // a[2][3] , 12

printf("%d\n", (*(a + 1))[1]); // a[1][1] , 6

'Coding > C' 카테고리의 다른 글

type 분석 연습  (0) 2018.05.27
포인터 타입에 따른 메모리 접근..  (0) 2018.05.26
배열을 함수의 인자로 넘기는 경우 주의할 점  (0) 2018.05.22
1차원 배열의 포인터  (0) 2018.05.22
little endian과 big endian  (0) 2018.05.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함