포인터: 두 판 사이의 차이

내위키
(프로)
편집 요약 없음
7번째 줄: 7번째 줄:
포인터는 데이터의 주소값만을 가지고 있기 때문에 포인터의 크기는 주소값의 크기로 고정된다. 예를 들어 32비트 프로그래밍을 한다고 가정하면, 그 '32비트'가 포인터의 크기가 된다. 즉 char든 double이든 float든 뭐든, 1만 바이트짜리 긴 문자열이든 그 포인터의 크기는 32비트다. 또한 포인터는 데이터의 시작 부분 주소값만을 담고 있다. 100 바이트짜리 char* 문자열이라고 해도 포인터는 무조건 첫 바이트의 주소값만 가지고 있다. 따라서 포인터만 가지고는 그 데이터가 어디에서 끝나는지 알 수 없다. C는 문자열의 끝이 [[NULL]]로 끝나야 한다고 정하고 있다.
포인터는 데이터의 주소값만을 가지고 있기 때문에 포인터의 크기는 주소값의 크기로 고정된다. 예를 들어 32비트 프로그래밍을 한다고 가정하면, 그 '32비트'가 포인터의 크기가 된다. 즉 char든 double이든 float든 뭐든, 1만 바이트짜리 긴 문자열이든 그 포인터의 크기는 32비트다. 또한 포인터는 데이터의 시작 부분 주소값만을 담고 있다. 100 바이트짜리 char* 문자열이라고 해도 포인터는 무조건 첫 바이트의 주소값만 가지고 있다. 따라서 포인터만 가지고는 그 데이터가 어디에서 끝나는지 알 수 없다. C는 문자열의 끝이 [[NULL]]로 끝나야 한다고 정하고 있다.


포인터의 연산을 허용하는 언어의 경우, 포인터의 값을 변경시키면 포인터가 가리키는 주소가 바뀌는 결과가 된다. 요즈음의 운영체제는 각 프로세스가 격리된 메모리 공간을 가지기 때문에 포인터 연산에 문제가 있더라도 그 프로세스가 죽어버리거나 하는 식으로 끝나지만 MS-DOS 혹은 그 위에서 돌아갔던 윈도우 3처럼 프로세스별 메모리 격리가 철저하지 않았던 운영체제는 포인터 연산을 잘못하면 다른 프로세스의 메모리를 침범하거나 심지어 운영체제가 사용하는 메모리 공간을 건드리는 사태가 벌어질 수도 있었다.  
포인터의 연산을 허용하는 언어의 경우, 포인터의 값을 변경시키면 포인터가 가리키는 주소가 바뀌는 결과가 된다. 예를 들어 포인터 변수에 1을 더하면 포인터가 가리키는 주소가 1 바이트 다음으로 옮겨 간다. 요즈음의 운영체제는 각 프로세스가 격리된 메모리 공간을 가지기 때문에 포인터 연산에 문제가 있더라도 그 프로세스가 죽어버리거나 하는 식으로 끝나지만 MS-DOS 혹은 그 위에서 돌아갔던 윈도우 3처럼 프로세스별 메모리 격리가 철저하지 않았던 운영체제는 포인터 연산을 잘못하면 다른 프로세스의 메모리를 침범하거나 심지어 운영체제가 사용하는 메모리 공간을 건드리는 사태가 벌어질 수도 있었다.  


겉보기에는 포인터를 사용하지 않는 것처럼 보이는 프로그래밍 언어도 알고 보면 내부에는 포인터 개념을 사용하고 있는 모습을 볼 수 있다. 예를 들어 포인터와는 전혀 관련이 없을 것 같은 [[파이썬]]의 경우,
겉보기에는 포인터를 사용하지 않는 것처럼 보이는 프로그래밍 언어도 알고 보면 내부에는 포인터 개념을 사용하고 있는 모습을 볼 수 있다. 예를 들어 포인터와는 전혀 관련이 없을 것 같은 [[파이썬]]의 경우,
18번째 줄: 18번째 줄:
</syntaxhighlight>
</syntaxhighlight>


이 코드는 y에 [1, 2, 3] 리스트를 대입한 것이 아니다. 이 코드를 실행시켜 보면 '4413603008 4413603008'와 같은 결과가 나온다. 숫자는 그때 그때 달라지지만 두 숫자는 같은 값이 나온다. 즉 x, y 모두 같은 메모리 공간 주소를 가리킨다는 뜻이다. 즉 y에는 x의 메모리 공간 주소를 대입시킨 것이다. 따라서 y.append(4) 명령으로 리스트 y에 1을 추가시키면 x 역시 [1, 2, 3, 4]로 리스트의 내용이 바뀐다. 단, 포인터 연산 같은 것은 막혀 있다.
이 코드는 y에 [1, 2, 3] 리스트를 대입한 것이 아니다. 이 코드를 실행시켜 보면 '4413603008'와 같은 결과가 나온다. 숫자는 그때 그때 달라지지만 두 숫자는 같은 값이 나온다. 즉 x, y 모두 같은 메모리 공간 주소를 가리킨다는 뜻이다. 즉 y에는 x의 메모리 공간 주소를 대입시킨 것이다. 따라서 y.append(4) 명령으로 리스트 y에 1을 추가시키면 x 역시 [1, 2, 3, 4]로 리스트의 내용이 바뀐다. 단, 포인터 연산 같은 것은 막혀 있다.


{{각주}}
{{각주}}


[[Category:프로그래밍 언어]]
[[Category:프로그래밍 언어]]

2022년 4월 27일 (수) 17:43 판

Pointer.

프로그래밍 언어에서 다른 변수(클래스를 비롯한 객체, 함수 등등도 포함한다)의 메모리 공간 주소를 가리키는 변수를 뜻한다.[1] C/C++ 언어의 강력한 기능이자 만악의 근원이며 프로그래머의 뒷목을 잡게 만드는 원흉이기도 하다.

포인터는 주로 C에서 많이 쓰이는 기능이기 때문에 여기서는 C를 기준으로 설명한다.

포인터는 데이터의 주소값만을 가지고 있기 때문에 포인터의 크기는 주소값의 크기로 고정된다. 예를 들어 32비트 프로그래밍을 한다고 가정하면, 그 '32비트'가 포인터의 크기가 된다. 즉 char든 double이든 float든 뭐든, 1만 바이트짜리 긴 문자열이든 그 포인터의 크기는 32비트다. 또한 포인터는 데이터의 시작 부분 주소값만을 담고 있다. 100 바이트짜리 char* 문자열이라고 해도 포인터는 무조건 첫 바이트의 주소값만 가지고 있다. 따라서 포인터만 가지고는 그 데이터가 어디에서 끝나는지 알 수 없다. C는 문자열의 끝이 NULL로 끝나야 한다고 정하고 있다.

포인터의 연산을 허용하는 언어의 경우, 포인터의 값을 변경시키면 포인터가 가리키는 주소가 바뀌는 결과가 된다. 예를 들어 포인터 변수에 1을 더하면 포인터가 가리키는 주소가 1 바이트 다음으로 옮겨 간다. 요즈음의 운영체제는 각 프로세스가 격리된 메모리 공간을 가지기 때문에 포인터 연산에 문제가 있더라도 그 프로세스가 죽어버리거나 하는 식으로 끝나지만 MS-DOS 혹은 그 위에서 돌아갔던 윈도우 3처럼 프로세스별 메모리 격리가 철저하지 않았던 운영체제는 포인터 연산을 잘못하면 다른 프로세스의 메모리를 침범하거나 심지어 운영체제가 사용하는 메모리 공간을 건드리는 사태가 벌어질 수도 있었다.

겉보기에는 포인터를 사용하지 않는 것처럼 보이는 프로그래밍 언어도 알고 보면 내부에는 포인터 개념을 사용하고 있는 모습을 볼 수 있다. 예를 들어 포인터와는 전혀 관련이 없을 것 같은 파이썬의 경우,

x = [1, 2, 3]
y = x

print(id(x), id(y))

이 코드는 y에 [1, 2, 3] 리스트를 대입한 것이 아니다. 이 코드를 실행시켜 보면 '4413603008'와 같은 결과가 나온다. 숫자는 그때 그때 달라지지만 두 숫자는 같은 값이 나온다. 즉 x, y 모두 같은 메모리 공간 주소를 가리킨다는 뜻이다. 즉 y에는 x의 메모리 공간 주소를 대입시킨 것이다. 따라서 y.append(4) 명령으로 리스트 y에 1을 추가시키면 x 역시 [1, 2, 3, 4]로 리스트의 내용이 바뀐다. 단, 포인터 연산 같은 것은 막혀 있다.

각주

  1. 'Point'에는 '가리키다'라는 뜻이 있다. 즉 포인터는 point-er, '가리키는 것'이라는 뜻이 된다.