Learn business/C++

[C++]포인터와 배열1


필자는 크게 포인터와 배열의 관계에서 크게 포인터 배열배열 포인터가 있다고 생각한다.

참고로 필자는 포인터 배열배열 포인터에 대해 용어가 혼동이 왔었는데 아래와 같이 화살표를 그려서 혼동을 해결했다. 필요한 사람만 참고했으면 좋겠다.

- 포인터 배열 : 포인터배열 포인터는 배열을 가리킴!


- 배열 포인터 : 배열포인터 배열은 포인터다!


[포인터와 배열 사이의 기본적인 관계 이해]
우선 배열의 이름이 갖는 의미부터 명확하게 집고 넘어가야 한다.

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