• 필자는 크게 포인터와 배열의 관계에서 크게 “포인터 배열”과 “배열 포인터”가 있다고 생각한다.
• 참고로 필자는 “포인터 배열”과 “배열 포인터”에 대해 용어가 혼동이 왔었는데 아래와 같이 화살표를 그려서 혼동을 해결했다. 필요한 사람만 참고했으면 좋겠다.
- 포인터 배열 : 포인터→배열 – 포인터는 배열을 가리킴!
- 배열 포인터 : 배열→포인터 – 배열은 포인터다!
[포인터와 배열 사이의 기본적인 관계 이해]
• 우선 배열의 이름이 갖는 의미부터 명확하게 집고 넘어가야 한다.
• n차원 배열의 이름은 배열의 선두번지 주소를 대표한다.
• 배열의 이름은 상수인 것이다!
• 아래 예시는 기본적인 것이니 답을 보지 말고 출력을 예상해보자.
#include <iostream> using namespace std; int main(void) { char a[] = "pointer"; cout << "a[0]: " << a[0] << endl; cout << "\"pointer\"[0]: " << "pointer"[0] << endl; cout << "a[1]: " << a[1] << endl; cout << "*(a+1): " << *(a + 1) << endl; cout << "*(1+a): " << *(1 + a) << endl; cout << "1[a]: " << 1[a] << endl; return 0; }
•답은 아래와 같다.
- a는 "pointer"의 첫번째 주소를 담고 있다. "pointer"도 마찬가지로 주소 값이므로 "pointer"[0]은 "p"가 출력됨
- a[1]은 *(a+1)로 표현이 가능하다. 그리고 *(a+1)은 *(1+a)의 표현과 같고 *(1+a)는 다시 1[a]로 표현될 수 있다.
[예시 1]
• 다음 예시를 통해
- 일시적인지 영구적인지 구별하자!
- 전치연산인지 후치연산인지 구별하자!
- 주소 또는 값의 증가 구별하자!
int n[] = {5, 20, 300, 4000, 50000}; (※ n은 배열을 첫 번째 주소를 나타내는 상수)
int *ptr = n;
※ 출력 값은 printf를 통해 출력되는 값
※ 내부 값은 포인터 변수 ptr이 가리키는 주소 내의 값
※ 주소는 포인터 변수 ptr의 값(처음은 n의 주소 값)
표현 | 출력 값 | 내부 값 | 주소 |
*ptr+1 | 6 | 5 | 1245032 |
*(ptr+1) | 20 | 5 | 1245032 |
*ptr+=1 | 6 | 6 | 1245032 |
*ptr++ | 6 | 20 | 1245036 |
(*ptr)++ | 20 | 21 | 1245036 |
*++ptr | 300 | 300 | 1245040 |
++*ptr | 301 | 301 | 1245040 |
※ 루비색으로 칠한 부분은 ‘내부의 값을 출력하고 한 칸 이동’의 뜻 (*ptr)→(ptr++)
• 연산자 우선순위 () > * > +
[정리]
• 위에서 어느 정도는 했던 내용이므로 정리차원에서 아래와 같이 설명하려고 한다.
int arr[5] = {1, 2, 3, 4, 5};
arr[0] == *arr == *(a+0) == *(0+a) == 0[a]
위와 같이 표현이 가능한데, 위 표현은 전부 값이 “1”이 출력된다.
다음 2차원 배열일 경우를 보자.
int arr[2][3] = {{1,2,3}, {4,5,6}};
arr[0][1] == *(*arr+1) == *(*(arr+0)+1) == *(1+*(0+arr)) == 1[0[arr]] == *(a[0]+1) == (*(a+0))[1] == *a[1]
위와 같이 표현이 가능한데, 위 표현은 전부 값이 “2”가 출력된다.
'Learn business > C++' 카테고리의 다른 글
[C++]포인터와 배열3 (1) | 2016.12.07 |
---|---|
[C++]포인터와 배열2 (0) | 2016.12.06 |
[C++]포인터 (0) | 2016.12.04 |
[C++]new & delete (0) | 2016.11.29 |