반응형
포인터란?

포인터 변수는 주소 값의 저장을 목적으로 선언됩니다.

주소의 시작 주소를 뜻한다.

 

 

 

포인터 변수

아래의 그림처럼 포인터 변수를 선언하는 방법은

자료형 * 변수명; 입니다.

포인터에 같은 자료형 변수의 주소값을 할당하여 저장할 수 있습니다.

 

포인터 변수의 크기는 시스템의 주소 값 크기에 따라 다릅니다.

16비트 시스템 => 주소 값 크기 16비트 => 포인터 변수 크기 16비트

32비트 시스템 => 주소 값 크기 32비트 => 포인터 변수 크기 32비트

64비트 시스템 => 주소 값 크기 64비트 => 포인터 변수 크기 64비트

int num = 1;

// 포인터 변수	자료형 * 변수명;
int * pnum;

// 정수형 포인터변수에 정수현변수의 주소 값을 넣는다.
pnum = #

 

 

 

포인터 변수 선언

변수의 자료형에 따라 포인터 변수의 선언방법에도 차이가 있다.

포인터 변수에 저장되는 값은 도무 정수의 형태이지만, 그래도 선언하는 방법에 차이가 있다.

차이가 있는 이유는 변수의 자료형에 따라 메모리 접근방식이 다르기 때문이다.

 

아래의 세개의 포인터 선언은 모두 동일한 선언문이다.

*의 위치에 따라서 차이는 없다.

 

하지만 2번 권장

1. int * ptr;
2. int* ptr;
3. int *ptr;

 

 

 

&연산자

&연산자는 변수의 주소 값을 반환해주는 연산자입니다.

연산자이기에 상수가 아닌 변수가 피연산자이어야 합니다.

&연산자의 반환 값은 포인터 변수에 저장을 합니다.

int num = 10;
int* pnum = #

 

포인터 변수에 변수의 주소값을 저장하려면 자료형이 같아야 합니다.

 

* 연산자

* 연산자는 포인터가 가리키는 메모리를 참조합니다.

* 연산자는 피연산자는 포인터변수여야 한다

아래의 코드에서 pnum은 num의 주소값을 가지고 있고,

*pnum은 num의 주소에 있는 값을 가지고 있다. 

*pnum의 값을 바꾸면 num의 값 또한 바뀌게 된다.

int num = 10;
int * pnum = #
*pnum = 20;
printf("%d", *pnum);

 

이 부분은 다소 헷갈릴 수 있으니 아래의 예시를 통해서 자세히 알아보자!

int num1 = 10;
int num2 = 8;

int *pnum;

pnum = &num1;		// 포인터 pnum이 num1의 주소를 뜻함.
(*pnum) += 10;		// *pnum은 num1에 주소에 있는 값을 건드린다. 즉 num1 += 10;

pnum = &num2;		// 포인터 pnum이 num2의 주소를 뜻함.
(*pnum) -= 3;		// *pnum은 num2에 주소에 있는 값을 건드린다. 즉 num2 -= 3;

// num1 : 20, num2 : 5 포인터로 주소를 참조하여 값을 변경

 

 

 

잘못된 포인터 사용법

아래의 코드에서 1번 예시와 2번 예시는 잘못된 예시이다.

1번 예시에서 pnum1에는 쓰레기 값으로 초기화 된다. 따라서 값을 저장하더라도

그 값이 어디에 저장되는지 알 수 없다.

 

2번 예시에서 pnum2에는 데이터를 저장했는데 저장된 곳이 어디인지 아무도 모른다.

 

포인터를 선언할 때는 3번 예시처럼 널 포인터로 초기화 하는것이 안전합니다.

널 포인터 NULL은 숫자 0을 의미하며 0은 주소값이 아니라 아무것도 가리키지 않는것을 뜻합니다.

NULL로 초기화하는 것을 권장합니다!

// 1번 예시
int * pnum1;
*pnum1 = 10;


// 2번 예시
int * pnum2 = 20;
*pnum2 = 10;


// 3번 예시
int * pnum3 = 0;
int * pnum4 = NULL;

 

 

 

포인터 정리
  • int* ptr = # 은 포인터를 선언하는 방법이다
  • ptr 은 할당받은 주소를 뜻한다.
  • *ptr 은 할당받은 주소의 값을 뜻한다.
  • &ptr 은 ptr 자체의 주소를 뜻한다.

아래의 코드를 예시로 설명하겠습니다.

num1의 주소는 100이라고 가정하겠습니다.

 

ptr의 값은 num1의 주소(100)를 할당받는다.

*ptr의 값은 ptr에 할당되어 있는 num1의 주소(100)에서 값(10)을 받는다.

&ptr의 값은 ptr자신의 주소(300)를 뜻합니다

 

ptr = &num2; 이후

ptr의 값은 num2의 주소(200)를 할당받는다

*ptr의 값은 ptr에 할당되어 있는 num2의 주소(200)에서 값(20)을 받는다.

&ptr의 값은 ptr자신의 주소(300)를 뜻합니다.

int num1 = 10; // &num1 = 100(주소값)
int num2 = 20;	// &num2 = 200(주소값)
int *ptr = #	// &ptr = 300(주소값)
ptr => ?	// ptr의 값은 num1의 주소를 할당받는다.
*ptr => ?	// ptr에 할당되어 있는 num1의 주소에서 값을 받는다.
&ptr => ?	// ptr자체의 주소값이며 지금은 300

ptr = &num2;
ptr => ?	// ptr의 값은 num2의 주소를 할당받는다.
*ptr => ?	// ptr에 할당되어 있는 num2의 주소에서 값을 받는다.
&ptr => ?	// ptr자체의 주소값이며 지금도 300

 

반응형

 

반응형

'C' 카테고리의 다른 글

포인터와 배열의 관계  (0) 2023.05.15
문자열에 대해서!  (0) 2023.05.15
난수에 대하여!  (0) 2023.05.12
배열에 대하여!  (0) 2023.05.12
재귀함수에 대하여!  (0) 2023.05.10

+ Recent posts