728x90
반응형

포인터 기본

  • 포인터

포인터란 변수 형태의 포인터와 상수 형태의 포인터를 어우르는 표현

  • 포인터 변수

포인터 변수는 주소 값의 저장을 목적으로 선언되는 변수이다. c언어의 low 레벨 특성을 나타내는 요소이고, 이러한 포인터를 이용하여 메모리에 직접 접근이 가능하다.

  • c언어에서의 주소 표현

c언어에서는 메모리 상의 주소를 표현할 때 시작 번지만을 가지고 위치를 표현한다. 왜냐하면 각 자료형마다 지니는 바이트 값을 시작 주소로부터 더하여 계산하면 해당 변수의 끝 번지를 계산할 수 있기 때문이다.

  • 포인터 변수의 선언과 & 연산자

다음은 포인터 변수의 선언과 & 연산자의 활용 예를 나타낸다.

위의 예에서 시사해야 할 점은 두 가지이다. 첫 번째는 포인터 변수의 선언 및 사용이고 두 번째는 포인터 변수와 일반 변수의 크기의 차이이다.

먼저 포인터 변수의 선언 및 사용에 관한 이야기이다.

7번 라인에서 일반 변수를 선언하였고, 8번 라인에서는 * (asterisk) 를 이용하여 ‘ int * ‘ (정수형 포인터 타입) 형 변수 pNum을 선언하고 num시작 주소 값을 대입한다. (char, int, double 등과 같이 char *, int *, double * 등 또한 새로운 자료형 타입으로 인정해야한다.) 그리고 12번 라인에서 pNumnum 변수의 주소 값을 출력해 보았을 때 결과가 같은 결과로 나왔는데 이는 당연한 것이다. pNum에는 num시작 주소 값을 대입했기 때문이다. 이처럼 포인터 변수인 pNum은 일반 변수의 주소 값을 저장한다! 그리고 13번 라인에서 * 연산자를 이용하여 pNum이 지니고 있는 주소 값으로 직접 찾아가 직접 접근을 하여 직접 접근한 메모리에 들어 있는 값을 출력했다. 그렇기 때문에 num과 마찬가지로 출력 값이 100으로 같은 결과를 보였다. , *(Asterisk) 연산자는 포인터 변수가 저장하고 있는 주소에 접근 혹은 참조(= 포인터가 가리키고 있는 메모리에 접근 혹은 참조)하는 연산을 수행한다.

다음으로는 포인터 변수와 일반 변수의 크기 차이이다.

12번 라인에 해당하는 결과 num4, pNum8이 나왔는데 int라는 유사점이 있는 변수인데 이렇게 다른 결과가 표출되는 이유로는 포인터는 주소를 표현하는 변수이기 때문에 컴퓨터 시스템이 표현할 수 있는 메모리의 크기 범위와 밀접한 연관이 있다. 64비트 시스템에서는 2^64 만큼의 메모리 번지 표현 경우의 수가 존재하기 때문에 포인터 변수는 자연스럽게 8바이트(=64비트)를 나타내는 것이다. 포인터 변수의 크기는 자료형에 상관없이 컴퓨터 시스템의 메모리 범위에 따라 4바이트(32비트 시스템) 혹은 8바이트(64비트 시스템)로 표현된다.

그렇다면 포인터 변수에서 자료형을 어떻게 일치시켜서 대입해야 하는지, 자료형은 왜 필요한지에 대해 알아보자. 다음은 포인터 변수에 일반 변수의 주소 값을 대입 연산 시 일치시켜야 할 타입들에 대한 정리 표이다.

먼저, 자료형을 어떻게 일치시켜서 대입해야 하는지에 대한 정리이다.

어차피 포인터 변수의 크기는 다 똑같은데 포인터 변수에 타입이 필요한 이유가 무엇인가? 그 이유는 해당 포인터 변수에 저장된 시작 주소로부터 몇 바이트를 읽어 들여야 하고, 그 읽어 들인 값을 정수로 해석해야 할지, 실수로 해석해야 할지를 결정한다. , 포인터의 타입()은 메모리 공간을 참조하는 기준이 된다.

int a = 10;
int * p = &a;
printf(“ %d “, *p); //
이 문장에서 p를 참조할 때 int * 는 참조의 기준이 된다.

  • 포인터의 잘못된 사용과 널 포인터

잘못된 초기화

int * ptr = 1234; // 1234 번지로 들어가게 된다.
*ptr = 100; // 1234
번지는 메모리 상에 중요한 프로그램이 적재되어 있을 수 있는데 해당 공간의 값을 변경 -> 에러

초기화 할 경우에는 NULL 포인터로 초기화를 한다. 아무 곳도 가리키지 않음을 의미한다. ( 0번지 의미가 아님 )

int * ptr = NULL; // 아무 곳도 가리키지 않는 포인터.


728x90
반응형

'컴퓨터 언어 정리 > C 언어' 카테고리의 다른 글

10 포인터와 함수  (0) 2020.09.13
09 포인터와 배열  (0) 2020.09.12
07 1차원 배열  (0) 2020.09.11
06 함수와 변수의 생명주기  (0) 2020.09.10
05 반복과 분기  (0) 2020.09.08

+ Recent posts