1차원 배열과 포인터
복잡한 배열과 포인터 타입
◦
이중 포인터◦
배열에 대한 포인터◦
포인터 변수의 배열◦
복잡한 포인터와 배열의 타입 및 크기 알아내기
2차원 배열과 포인터 연습 문제
17강. 배열과 포인터
int 배열 ary의 원소를 가리키는 포인터
◦
int 포인터 변수 : int *ptr = &ary[0];◦
ptr++는? 다음 원소를 가리킴!◦
ptr--는? 이전 원소를 가리킴!17강. 배열과 포인터 1차원 배열과 포인터
int ary[5] = { 1, 2, 3, 4, 5 }; 배열의 모든 원소의 값 을 합산한 결과를 출력하되, 포인터를 통해 각 원소에 접 근해 보라.
17강. 배열과 포인터 1차원 배열과 포인터
int main()
{ int ary[5] = { 1, 2, 3, 4, 5 };
int *ptr;
int result = 0;
ptr = &ary[0];
for (int i = 0; i < 5; i++) {
result += *ptr;
ptr++;
}
cout << "합계 : " << result << endl;
1 2 3 4 5 6 7 8 10 9 11 12 13 14 15
4 /21
배열 이름
◦
int ary[5];◦
배열 이름 ary 첫 번째 원소의 주소◦
상수이므로 값 변경 불가 : ary = 2000; X17강. 배열과 포인터 1차원 배열과 포인터
int main()
{ int ary[5] = { 1, 2, 3, 4, 5 };
int *p;
p = ary; // p = &ary[0] 동일
for (int i = 0; i < 5; i++) {
cout << *p << endl;
p++;
}
return 0;
} 1 2 3 4 5 6 7 8 10 9 11 12 13 14 15
ary는 &ary[0]와 같다!
ary의 타입은 int *이다!
ary[3] = 2;에서 ary[3]의 동작 원리
◦
ary[3] *(ary + 3)◦
ary[0] *(ary + 0) *ary◦
ary[i] *(ary + i)◦
내부적으로 포인터로 처리됨
포인터도 배열 모양으로 사용 가능
◦
p가 ary 배열의 첫 번째 원소를 가리키는 경우◦
*p p[0] ary[0]◦
*(p + 1) p[1] ary[1]◦
*(p + i) p[i] ary[i]17강. 배열과 포인터 1차원 배열과 포인터
배열은 포인터처럼,
포인터는 배열처럼 사용 가능!
17강. 배열과 포인터 1차원 배열과 포인터
int main()
{ int ary[5] = { 1, 2, 3, 4, 5 };
int *ptr;
ptr = ary;
for (int i = 0; i < 5; i++)
*(ary + i) = *(ary + i) * 100;
for (int i = 0; i < 5; i++)
cout << "ptr[" << i << "] : " << ptr[i] << endl;
return 0;
} 1 2 3 4 5 6 7 8 10 9 11 12 13 14
15 *(ptr + i)
ary[i] = ary[i] * 100;
ptr = &ary[0];
이중 포인터 포인터에 대한 포인터
◦
포인터 변수 또한 변수이다!◦
int num;의 주소를 저장하는 변수는? int *ptr1 = #◦
int *ptr1;의 주소를 저장하는 변수는? int **ptr2 = &ptr1;
이중 포인터
확장 가능
◦
int ***ptr; int ****ptr;17강. 배열과 포인터 복잡한 배열과 포인터 타입
역참조 연산자의 활용
◦
int **ptr2
*ptr2 : 가리키는 int 포인터
**ptr2 : 가리키는 int 포인터가 가리키는 int 변수17강. 배열과 포인터 복잡한 배열과 포인터 타입
int main()
{ int num = 5;
int *ptr1 = #
int **ptr2 = &ptr1;
**ptr2 = 100;
cout << "num : " << num << endl;
cout << "*ptr1 : " << *ptr1 << endl;
cout << "**ptr2 : " << **ptr2 << endl;
return 0;
} 1 2 3 4 5 6 7 8 10 9 11 12 13 14
100
어떤 변수에 주소 연산자 적용 그 변수 타입의 포인터
◦
int a; &a int 포인터 int *◦
double b; &b double 포인터 double *◦
int *p; &p int 포인터의 포인터 int **◦
int ary[5]; &ary int 1차원 배열[5] 포인터 int (*)[5]◦
int ary[3][4]; &ary 2차원 배열[3][4]의 포인터 int (*)[3][4]17강. 배열과 포인터 복잡한 배열과 포인터 타입
어떤 변수에 주소 연산자를 붙이면 그 변수 타입의 포인터가 반환됨!
1차원 배열 자체를 가리키는 포인터의 사용
◦
원소를 가리키는 포인터가 아님!17강. 배열과 포인터 복잡한 배열과 포인터 타입
int main()
{ int ary1[5] = { 1, 2, 3, 4, 5 };
int(*ptr1)[5] = &ary1;
for (int i = 0; i < 5; i++)
cout << "(*ptr1)[" << i << "]=" << (*ptr1)[i] << " " << endl;
return 0;
} 1 2 3 4 5 6 7 8
10 9 ary1[i]와 동일
int 변수를 원소로 갖는 배열
◦
int ary1[5];
int * 변수를 원소로 갖는 배열
◦
int *ary2[5];
ary2[0], ary2[1], ..., ary2[4] 각각이 int * 변수 의미◦
ary2[0][1]의 의미는?
ary2[0] 포인터가 가리키는 곳, 그 다음 int
int (*a)[5]와 int *a[5]의 비교
◦
int (*a)[5] : (int [5]) 배열에 대한 포인터◦
int *a[5] : int * 변수를 원소로 갖는 배열17강. 배열과 포인터 복잡한 배열과 포인터 타입
17강. 배열과 포인터 복잡한 배열과 포인터 타입
int main()
{ int a = 1, b = 2, c = 3;
int *ary[3] = { &a, &b, &c };
for (int i = 0; i < 3; i++) *ary[i] = *ary[i] * 100;
cout << "a : " << a << endl;
cout << "b : " << b << endl;
cout << "c : " << c << endl;
return 0;
} 1 2 3 4 5 6 7 8 10 9 11 12 13 14
*
*
*
1
2
3
a
b
c ary
예 : int *(*var[3])[3]의 타입은?
◦
변수명을 중심으로 영어로 읽은 후 해석
괄호가 없다면 배열이 포인터보다 우선◦
var is array[3] of pointer to array[3] of pointer to int◦
int * 배열[3]에 대한 포인터를 원소로 갖는 배열[3]17강. 배열과 포인터 복잡한 배열과 포인터 타입
2차원 배열에서 첫 번째 원소란?
◦
2차원 배열에서 첫 번째 원소란? 첫 번째 1차원 배열
int ary[3][4] 첫 번째 원소 ary[0] 첫 번째 1차원 배열 [4]17강. 배열과 포인터 2차원 배열과 포인터
1차원 배열의 이름
◦
첫 번째 원소의 주소!
2차원 배열의 이름
◦
첫 번째 원소의 주소!◦
int ary[3][4]에서
ary 첫 번째 원소의 주소 &ary[0]
ary[0]은 1차원 배열[4] &ary[0]은 1차원 배열[4]의 주소
int (*p)[4] = ary; p++ : 16 증가
p[0][2]와 같이 2차원 배열과 동일하게 사용 가능
17강. 배열과 포인터 2차원 배열과 포인터
배열 이름의 타입 :
가장 가까운 배열만 포인터로 변경하면 됨 int ary1[2][3][4]; ary1 int (*)[3][4]
배열은 포인터처럼, 포인터는 배열처럼 사용 가능
◦
ary[i][j]에 대해 다음 모두 동일
*(ary[i] + j)
(*(ary + i))[j]
*(*(ary + i) + j)◦
예 : int ary[3][4]
*(*(ary + 1) + 2) ary[1][2]
*ary ary[0]
*(ary + 1) + 2 ary[1] + 2 &ary[1][2]
*(ary + 1) ary[1]
ary + 1 &ary[1]17강. 배열과 포인터 2차원 배열과 포인터
17강. 배열과 포인터 2차원 배열과 포인터
int main()
{ int ary[3][4];
int(*ptr)[4] = ary;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) *(*(ary + i) + j) = i + j;
// 배열은 포인터처럼 사용 가능 }
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) cout << ptr[i][j] << "\t";
// 포인터는 배열처럼 사용 가능 cout << endl;
} 1 2
3 4 5 6 7 8 10 9 11 12 13 14 15 16 17 18 19 20
int ary[3][4] 가 있다. ary[2][3] = 5;와 동일한 의미 가 되도록 ary를 포인터 방식으로 사용해 보라.
다음 각 변수가 무엇을 뜻하는지 말해 보라.
◦
int **a[3];◦
int (*b)[3][4];◦
int *(*c)[3];17강. 배열과 포인터 연습 문제
*(*(ary + 2) + 3) = 5;
*(ary[2] + 3) = 5;
(*(ary + 2))[3] = 5;
int 포인터의 포인터를 원소로 갖는 1차원 배열[3]
int 포인터를 원소로 갖는 1차원 배열[3]에 대한 포인터 2차원 배열[3][4]에 대한 포인터
ary[i][j] = *(*(ary + i) + j)
다음과 같은 2차원 배열 ary가 있다. 이 배열의 첫 번째 원소의 주소를 저장할 수 있는 포인터 변수 ptr을 선언하 고 첫 번째 원소(1차원 배열)를 가리키게 한 후 ptr을 통 해 모든 원소의 값을 합산한 결과를 출력하도록 하라. 단, 포인터 변수 ptr를 2차원 배열처럼 사용해 보도록 하라.
17강. 배열과 포인터 연습 문제
int ary[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
17강. 배열과 포인터 연습 문제
int main()
{ int ary[3][4] = { { 1, 2, 3, 4 }, { 5, 6, 7, 8 }, { 9, 10, 11, 12 } };
int (*ptr)[4] = ary;
int sum = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++) sum += ptr[i][j];
}
cout << "합계 : " << sum << endl;
return 0;
} 1 2 3 4 5 6 7 8 10 9 11 12 13 14 15 16
17강의 학습 내용
◦
1차원 배열과 포인터◦
복잡한 배열과 포인터 타입
이중 포인터
배열에 대한 포인터, ...◦
2차원 배열과 포인터
18강의 학습 내용
◦
함수와 포인터◦
함수와 배열17강. 배열과 포인터 학습 내용 정리