포인터: 두 판 사이의 차이

내위키
편집 요약 없음
편집 요약 없음
5번째 줄: 5번째 줄:
포인터는 주로 [[C]]에서 많이 쓰이는 기능이기 때문에 여기서는 [[C]]를 기준으로 설명한다.
포인터는 주로 [[C]]에서 많이 쓰이는 기능이기 때문에 여기서는 [[C]]를 기준으로 설명한다.


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


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


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


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

2021년 10월 21일 (목) 12:37 판

Pointer.

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

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

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

포인터의 연산을 허용하는 언어의 경우, 포인터의 값을 변경시키면 포인터가 가리키는 주소가 바뀌는 결과가 된다.

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

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

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

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

각주

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