포인터 (Pointer)
- C언어에서 포인터(pointer)란 메모리의 주소값을 저장하는 변수이며, 포인터 변수라고도 부릅니다.
- char형 변수가 문자를 저장하고, int형 변수가 정수를 저장하는 것처럼 포인터는 주소값을 저장합니다.
- 포인터를 사용하여 허가된 모든 메모리(스택) 영역에 접근할 수 있습니다.
포인터 사용에 대한 오해
- 포인터를 사용하면 성능이 향상된다.(속도가 빨라진다.)
- 프로그래밍을 하려면 포인터는 넘어야 할 산이다.
- 포인터를 숙지해야 진정한 프로그래머다.
포인터 사용에 대한 오해 - 반론
- 컴파일러가 최적화 기술이 발달하면서 성능 향상에 대한 차이가 사라졌습니다.
- 포인터를 잘못 사용하여 메모리 영역을 잘못 건드리게 되면 프로그램이나 시스템에 치명적인 손상을 입힐 수 있습니다.
포인터 사용 예제
- 2개 요소만 저장할 수 있는 배열에 3개 데이터를 저장하는 예제입니다.
- 3번째 데이터는 배열이 확보되지 않은 메모리에 기록하게 됩니다.
- 컴파일에 문제는 없는 코드입니다.
- 다만, 3번째 데이터를 메모리에 기록할 때, 사용중인 메모리에 기록한다면, 다른 프로그램이나 시스템의 치명적인 손상을 입힐 수 있습니다.
class UnsafeTEST
{
static void Main()
{
byte[] arr = new byte[2];
unsafe
{
fixed(byte* a = &arr[0])
{
byte* p = a;
*p++ = 1;
*p++ = 2;
*p++ = 3;
}
}
}
fixed 키워드
- unsafe 컨텍스트에서만 사용이 가능합니다.
- 클래스가 인스턴스화 되면 CLR에 의해 언제든지 메모리 주소가 바뀔 수 있는데,
- fixed 키워드 사용시 사용자가 포인터를 사용하고 있을 때 메모리 주소의 고정해주는 역할을 합니다.
정리
- 컴파일러의 최적화 기술이 발달하며 포인터를 사용할 필요가 없어졌습니다.
- 포인터는 해석하기가 어렵고, 오히려 메모리 영역에 접근할 수 있기 때문에 시스템에 치명적인 문제를 일으킬 수 있습니다.
'프로그래밍 > (도서)C#코딩의기술-실전' 카테고리의 다른 글
[C#] 코딩의기술(실전편) - 2.11 TryParse에서 결과를 보지 않는 경우 (0) | 2022.03.31 |
---|---|
[C#] 코딩의기술(실전편) - 2.9 Goto 구문 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 2.6 unsafe (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 2.5 Checked 키워드 (0) | 2022.03.31 |
[C#] 코딩의기술(실전편) - 2.3 Format 메서드 (0) | 2022.03.31 |