80 likes | 240 Views
배열포인터 / 포인터배열. 강성관. 포인터 배열 (1/3). 포인터 변수를 여러 개 모아 놓은 배열. 포인터 배열. 아래 두 문장의 차이는 ?. 1500. 10. 1700. 10. 1702. 10. 2410. 10. 2622. 10. 포인터 배열 (2/3). ip. 포인터 변수가 여러 개 필요하고 자주 참조된다면 포인터 변수를 일일이 선언하기 보다는 포인터 배열을 만들어 활용한다. 3000. 3002. 3004. 3006. 3008. ip[0]. ip[1]. ip[2].
E N D
배열포인터/포인터배열 강성관
포인터 배열 (1/3) • 포인터 변수를 여러 개 모아 놓은 배열 포인터 배열 • 아래 두 문장의 차이는?
1500 10 1700 10 1702 10 2410 10 2622 10 포인터 배열 (2/3) ip 포인터 변수가 여러 개 필요하고 자주 참조된다면 포인터 변수를 일일이 선언하기 보다는 포인터 배열을 만들어 활용한다. 3000 3002 3004 3006 3008 ip[0] ip[1] ip[2] ip[3] ip[4] 1500 1700 1702 2410 2622 V3 v1 V2 V4 V5 NOTE배열 포인터와 혼동하지 말아야 한다. 배열 포인터는 배열을 가리키는 하나의 포인터 변수일 뿐이다. 그런 반면 포인터 배열은 다수의 포인터를 담아두기 위해 하나 이상의 메모리 공간을 할당 받은 배열이다. 다음과 같이 배열포인터와 포인터배열의 선언형태를 잘 구분할 수 있어야 하겠다. int (*p)[5]; /* 배열 포인터의 선언: p는 2바이트 포인터 변수, p가 가리키는 대상체는 5개의 요소를 가진 배열*/ int *p[5]; /* 포인터 배열의 선언: p는 10바이트 포인터 배열, 최대 5개의 포인터를 담을 수 있다. */
문자열 포인터 배열의 선언 char *menu[] = { “New Game”, “Load Game”, “2 Play”, “Option”, “Exit” }; e w G a m 2 e L o a d G a m e \0 menu[2] menu[3] \0 N menu[1] a menu[4] y \0 O p t P o i \0 E x i t \0 menu[0] l n menu[][10] 과 같이 일반 배열로 선언했을 때와의 차이를 알아야 한다. 메모리 용량 : 38 bytes 꼭 필요한 메모리 공간 만큼만 할당 받아 사용하게 된다. menu[5][10]으로 선언한 경우에 비해 메모리 낭비가 없다. 포인터배열 menu[4][2] 또는 *(*(menu+4)+2) 포인터 배열 (3/3)
배열과 포인터 (7/10) 배열 포인터 • 2차원 이상의 다차원 배열을 가리키는 포인터 • 배열 포인터를 선언 • p는 요소의 개수가 3개인 1차원 배열 2개를 가진 배열 a를 가리킴 • p == a[0] • p+1 == a[1]
p a[0][0] a[0][1] a[0][2] a[1][0] a[1][1] a[1][2] 배열명 a 1000 1002 1004 1006 1008 1010 60 30 20 10 50 40 p+1 배열포인터 배열 포인터 p의 증가는 p가 가리키는 대상체인 2차원 배열의 1차원 요소 수만큼 증가한다. 배열과 포인터 (8/10) • 배열 포인터 int a[2][3] = {10,20,30,40,50,60}; int (*p)[3]; p = a; 1차원 배열의 요소 수 sizeof(p) = ? sizeof(p+1) = ? sizeof(*p) = ? sizeof(*(p+1)) = ?
주의 배열과 포인터 (9/10) sizeof(*(p+1))의 크기는 2*3*sizeof(int) == 12 bytes 배열 포인터 p가 가리키는 대상체는 표면적으로 3차원 배열이지만 내부적으로 증가하는 단위는 배열 포인터 선언 시에 명시해준 2차원 배열의 크기만큼 증가한다.
a a[0] a[0][0] p a[0][0][0] 1000 p+1 a[0][0][1] 1002 p+2 a[0][0][2] 1004 a[0][1] p+3 a[0][1][0] 1006 p+4 a[0][1][1] 1008 p+5 a[0][1][2] 1010 a[1] a[1][0] p+6 a[1][0][0] 1012 p+7 a[1][0][1] 1014 p+8 a[1][0][2] 1016 a[1][1] p+9 a[1][1][0] 1018 p+10 a[1][1][1] 1020 p+11 a[1][1][2] 1022 배열과 포인터 (10/10) 3차원 배열과 포인터 int a[2][2][3]; int *p = a; ⊙ 3차원 배열명 : a ⊙ 2차원 배열명 : a[0], a[1] ⊙ 1차원 배열명 : a[0][0], a[0][1], a[1][0], a[1][1] a[i][j][k] == *(*(*(a + i) + j) + k) *(a + i) : a[0], a[1] *(*(a+i)+j) : a[0][0], a[0][1], a[1][0], a[1][1] a[0][0][0] == *a[0][0] == **a[0] == ***a a == a[0] == a[0][0] == &a[0][0][0] == 0x1000 a[1] == a[1][0] == &a[1][0][0] == 0x1012 1, 2차원 배열을 가리키는 포인터 상수