[C] 포인터 개념

2021. 1. 6. 13:48프로그래밍 공부/C 공부

포인터?

간접 주소 지정방식을 구현하기 위해 C에는 포인터라는 개념이 있음
포인터는 중간에서 메모리 주소를 할당해주는 기능을함 

 

왜 포인터를 사용해야하나?

포인터는 다른 함수에 선언된 변수라도 메모리 주소를 읽거나 쓰면서 변경할 수 있어지므로 다양한 프로그래밍이 가능해진다.

 

포인터 사용법

#include <stdio.h>

int main()
{
	short result; 
    // result 이라는 임의의 변수 선언.
	
    short* ptr; 
    // *ptr 로 포인터 변수 생성, 포인터는 무조건 4바이트의 공간을 갖음. 
    //short은 포인터가 받은 데이터의 자료형을 결정함.

	printf("포인터의 주소는 %p 입니다.\n", &ptr); 
    // 생성된 포인터의 위치를 파악함. ptr변수 앞에 &를 붙여서 자체 위치를 출력. 
	
	ptr = &result;  
    // 포인터를 통해 할당될 주소를 result의 메모리 주소로 지정함. 
    // ptr = &형태는 포인터 변수에 대상의 주소를 저장한다.

	printf("result의 주소(%p)를 포인터의 자료를 받을 주소로 설정하였습니다.\n", ptr);
	printf("포인터(%p)는 %p 위치를 가리키고있습니다.\n", &ptr, ptr);


	*ptr = 0x12; 
    // 포인터를 통해 result변수에 값을 할당
    // *ptr = 형태는 포인터가 가리키는 대상의 형태를 저장한다.
    
	printf("result 변수에 0x%X(%d)를 입력했습니다.\n", result, result);
  }

 

포인터와 const 

포인터는 그 특성상 일반변수보다 실수할 확률이 높기 때문에 const 키워드를 활용하는 것이 좋다. 

총 4가지 형태로 포인터를 선언할 수 있다. 

(1) int *ptr = &addr : const가 없는 형태

(2) const int *ptr = &addr : 할당되는 자료에 const가 부여된 형태

(3) int *const ptr = &addr : 포인터가 가리키는 주소에 const가 부여된 형태

(4) const int *const ptr = &addr : 할당되는 자료와 포인터가 가리키는 주소에 const가 부여된 형태 

 

2번과 3번의 경우를 알면 4번의 경우는 예측이 된다.

//.....

int addr = 5, tmp = 0;

//(2)번 const int *ptr
    const int *ptr = &addr; // 주소 지정or변경 원활
    *ptr = tmp; // 오류:데이터 변경 불가


//(3)번 int *const ptr
    int *const ptr = &addr;
    *ptr = tmp; // 데이터 변경 원활
    *ptr = &tmp ; // 오류 : 주소 변경 불가

 

포인터 변수의 주소 연산

포인터에 저장된 주소값은 앞에 선언된 자료형 만큼의 공간을 차지한다. 이 공간을 어떤식으로 인식할까?

 

C언어는 항상 사용할 메모리 공간을 먼저 선언하므로 포인터는 '메모리 시작 주소만 기억'하면 자연스럽게 할당할 공간의 주소를 알 수 있다. 

{ short data = 0;
  short *p = &data; 
  // data변수에 할당된 메모리 주소의 시작점만 기억한다. 
  // 그뒤 자료형이 short이므로 해당 시작점에서 2바이트만 차지하면 된다. 
  *p = 3; }

만약 p++ 를 하면 어떻게 될까? p는 포인터 주소를 가지고 있기 때문에 포인터 주소 +1을 의미하는 것이 된다.

이는 주소를 한칸 이동시키라는 뜻으로 이 결과값은 자료형에 따라 달라진다.

* 하지만 이러한 연산에도 불구하고 &p1 의 값은 변하지 않는다.

#include <stdio.h>

int main()
{
    char *p1 = (char *)100;
    short *p2 = (short*)100;
    int *p3 = (int*)100;
    double *p4 = (double*)100;

    printf("char 포인터가 갖고있는 값은 %p 입니다.\nshort 포인터가 갖고있는 값은 %p 입니다.\n", p1,p2);
   
    p1++;
    p2++;

    printf("char 포인터가 갖고있는 값은 %p 입니다.\nshort 포인터가 갖고있는 값은 %p 입니다.\n", p1, p2);
        

}

'프로그래밍 공부 > C 공부' 카테고리의 다른 글

[C] void 포인터  (0) 2021.01.06
[C] 포인터 활용  (0) 2021.01.06
[C] if 조건문  (0) 2021.01.05
[C] 지역변수와 전역변수(+ extern, static, const)  (0) 2021.01.05
[C] 저장공간 할당  (0) 2021.01.05